linux中网络编程<1>

1 网络编程API

(1)网络层的ip地址可以唯一标识网络中的主机,传输层通过协议+端口唯一标识主机中的应用程序。这样以来使用三元组(地址,协议,端口)标识网络的进程。

(2)socket--->插槽(低俗的哈哈哈哈),看作文件描述符,Linux基本哲学一切皆文件,那么是不是也可以读写关闭这样的习惯性操作呢。对了,差不多的啦。

(3)来看看tcp交互流程

ok具体看看各个函数

第一个:int socket(int domain,int type,int protocol)

参数介绍:

domain:协议域,决定了socekt地址类型

type:socket类型.

protocol:指定协议。

调用这个函数返回的socket描述符就在协议族的空间中,但是没有一个具体的地址,所以咱们给予它地址就有勒bind

第二个:int bind(int socketfd,const struct sockaddr *addr,socklen_t addrlen)

参数介绍

addr:指向半丁给sockfd的协议地址。根据创建socekt时的地址协议族的不同而不同

第三个和第四个:listen connect

监听 客户端呢就链接撒

第五个:accept

当客户端发送了链接请求以后,就开始接受。都接受了就可以开始交流了嘛---->进行io操作。

注意:accept成功,返回值由内核自动生成一个新的描述符哦。

第六个,第六组吧

read() write()

recv() send()

readv() writev()

recvmsg() sendmsg()

recvfrom() sendto()

read读取成功会放回实际读取的字节数。0标识读到我呢见的末尾。

2 来一个例子

 1 //client.cpp
 2 #include<stdio.h>
 3 #include<stdlib.h>
 4 #include<string.h>
 5 #include<errno.h>
 6 #include<sys/types.h>
 7 #include<sys/socket.h>
 8 #include<netinet/in.h>
 9 #include<arpa/inet.h>
10 #include<unistd.h>
11 #define MAXLINE 4096
12
13 int main(int argc, char** argv){
14     int   sockfd, n;
15     char  recvline[4096], sendline[4096];
16     struct sockaddr_in  servaddr;
17
18     if( argc != 2){
19         printf("usage: ./client <ipaddress>\n");
20         return 0;
21     }
22
23     if( (sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0){
24         printf("create socket error: %s(errno: %d)\n", strerror(errno),errno);
25         return 0;
26     }
27
28     memset(&servaddr, 0, sizeof(servaddr));
29     servaddr.sin_family = AF_INET;
30     servaddr.sin_port = htons(6666);
31     if( inet_pton(AF_INET, argv[1], &servaddr.sin_addr) <= 0){
32         printf("inet_pton error for %s\n",argv[1]);
33         return 0;
34     }
35
36     if( connect(sockfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) < 0){
37         printf("connect error: %s(errno: %d)\n",strerror(errno),errno);
38         return 0;
39     }
40
41     printf("send msg to server: \n");
42     fgets(sendline, 4096, stdin);
43     if( send(sockfd, sendline, strlen(sendline), 0) < 0){
44         printf("send msg error: %s(errno: %d)\n", strerror(errno), errno);
45         return 0;
46     }
47     close(sockfd);
48     return 0;
49 }

 1 #include<stdio.h>
 2 #include<stdlib.h>
 3 #include<string.h>
 4 #include<errno.h>
 5 #include<sys/types.h>
 6 #include<sys/socket.h>
 7 #include<netinet/in.h>
 8 #include<unistd.h>
 9
10 #define MAXLINE 4096
11
12 int main(int argc, char** argv){
13     int  listenfd, connfd;//这里有两个 一个是创建套接字描述符 一个是建立连接后的描述符哈
14     struct sockaddr_in  servaddr;
15     char  buff[4096];
16     int  n;
17
18     if( (listenfd = socket(AF_INET, SOCK_STREAM, 0)) == -1 ){
19         printf("create socket error: %s(errno: %d)\n",strerror(errno),errno);
20         return 0;
21     }
22
23     memset(&servaddr, 0, sizeof(servaddr));
24     servaddr.sin_family = AF_INET;
25     servaddr.sin_addr.s_addr = htonl(INADDR_ANY);
26     servaddr.sin_port = htons(6666);
27
28     if( bind(listenfd, (struct sockaddr*)&servaddr, sizeof(servaddr)) == -1){
29         printf("bind socket error: %s(errno: %d)\n",strerror(errno),errno);
30         return 0;
31     }
32
33     if( listen(listenfd, 10) == -1){
34         printf("listen socket error: %s(errno: %d)\n",strerror(errno),errno);
35         return 0;
36     }
37
38     printf("======waiting for client‘s request======\n");
39     while(1){
40         if( (connfd = accept(listenfd, (struct sockaddr*)NULL, NULL)) == -1){
41             printf("accept socket error: %s(errno: %d)",strerror(errno),errno);
42             continue;
43         }
44         n = recv(connfd, buff, MAXLINE, 0);
45         buff[n] = ‘\0‘;//注意了 要输出字符串 后面加上这个玩意哦
46         printf("recv msg from client: %s\n", buff);
47         close(connfd);
48     }
49     close(listenfd);
50     return 0;
51 }

 1 all:server client
 2 server:server.o
 3     g++ -g -o server server.o
 4 client:client.o
 5     g++ -g -o client client.o
 6 server.o:server.cpp
 7     g++ -g -c server.cpp
 8 client.o:client.cpp
 9     g++ -g -c client.cpp
10 clean:all
11     rm all

先运行./server 然后./client 127.0.0.1如下图所示

ok 热身下了,什么字节序之类的下一篇在总结勒。加油。。。。

原文地址:https://www.cnblogs.com/lanjianhappy/p/8955105.html

时间: 2024-08-03 00:06:16

linux中网络编程<1>的相关文章

linux socket网络编程 常用函数及头文件

转自:http://blog.chinaunix.net/u3/102500/showart_2065640.html 一 三种类型的套接字: 1.流式套接字(SOCKET_STREAM) 提供面向连接的可靠的数据传输服务.数据被看作是字节流,无长度限制.例如FTP协议就采用这种. 2.数据报式套接字(SOCKET_DGRAM) 提供无连接的数据传输服务,不保证可靠性. 3.原始式套接字(SOCKET_RAW) 该接口允许对较低层次协议,如IP,ICMP直接访问. 二 基本套接字系统调有有如下一

linux c 网络编程:用域名获取IP地址或者用IP获取域名 网络地址转换成整型 主机字符顺序与网络字节顺序的转换

用域名获取IP地址或者用IP获取域名 #include<stdio.h> #include<sys/socket.h> #include<netdb.h> int main(int argc,char **aggv) { struct hostent *host; char hostname[]="www.163.com"; char hostname2[]="www.baidu.com"; struct in_addr in;

java 中网络编程

网络编程 IP地址: 主机在网络中的逻辑地址 Port: 标定主机中的进程 一个进程绑定一个端口 协议: 网络双方约定的通信标准 应用 表示 应用 HTTP FTP TELNET 会话 传输 传输 网络 网络 寻址和路由 数据链路 网络接口 TCP/IP 物理 传输 TCP 传输控制协议 连接 安全可靠 UDP 用户数据报协议 无连接 不可靠 Socket 套接字 java 中网络编程

【LINUX/UNIX网络编程】之简单多线程服务器(多人群聊系统)

RT,Linux下使用c实现的多线程服务器.这个真是简单的不能再简单的了,有写的不好的地方,还希望大神轻拍.(>﹏<) 本学期Linux.unix网络编程的第四个作业. 先上实验要求: [实验目的] 1.熟练掌握线程的创建与终止方法: 2.熟练掌握线程间通信同步方法: 3.应用套接字函数完成多线程服务器,实现服务器与客户端的信息交互. [实验内容] 通过一个服务器实现最多5个客户之间的信息群发. 服务器显示客户的登录与退出: 客户连接后首先发送客户名称,之后发送群聊信息: 客户输入bye代表退

Linux Socket 网络编程

Linux下的网络编程指的是socket套接字编程,入门比较简单.在学校里学过一些皮毛,平时就是自学玩,没有见识过真正的socket编程大程序,比较遗憾.总感觉每次看的时候都有收获,但是每次看完了之后,过段时间不看,重新拾起这些知识的时候又要从头开始,所以,在这里做个笔记也算是做个模板,以后可以直接从某一个阶段开始接着玩... 1. socket套接字介绍 socket机制其实就是包括socket, bind, listen, connect, accept等函数的方法,其通过指定的函数实现不同

linux中shell编程

shell编程 1 echo -e 识别\转义符 \a \b \t \n \x十六进制 \0八进制 等等 #!/bin/bash echo -e "hello world" 执行脚本:方式1 :chmod 755 hello.sh ./hello.sh 方式2 :bash ./hello.sh(这种方式不需要给执行权限) 1 历史命令 history 直接回车就可以看到已经敲过得命令.-c清空缓存中和文件中的命令 -w将缓存中命令写入 家目录/.bash_history 这个命令可以帮

linux socket网络编程详解

一.系统调用和应用编程接口 在讨论网络通信之前, 首先明确两个概念:系统调用(system call) 和 应用编程接口(Application Programming Interface,API). 操作系统使用 系统调用 机制来实现 在应用程序 与 操作系统 之间进行控制权传递. 当某个应用进程启动了系统调用时,控制权就从应用程序传递给操作系统.操作系统执行某个内部过程之后,把控制权返回给应用程序. 对程序员来说,每一个系统调用和一般程序设计中的函数调用非常相似,只是系统调用是将控制权传递给

linux C 网络编程基础

TCP/IP基础 UDP提供无连接服务 UDP的数据格式: #ifdef __FAVOR_BSD struct udphdr { u_int16_t uh_sport; /* source port */ u_int16_t uh_dport; /* destination port */ u_int16_t uh_ulen; /* udp length */ u_int16_t uh_sum; /* udp checksum */ }; #else struct udphdr { u_int1

Android开发中网络编程与常见功能优化总结

Android提供的AsyncTask,但事实上AsyncTask的问题更加严重,Thread只有在run函数不结束时才出现这种内存泄露问题,然而AsyncTask内部的实现机制是运用了 ThreadPoolExcutor,该类产生的Thread对象的生命周期是不确定的,是应用程序无法控制的,因此如果AsyncTask作为Activity的内部类,就更容易出现内存泄露的问题. 一般的应用都是从服务器获取数据,然后通过极致的界面风格,将数据清晰,明朗的展现给用户. 那么就可以分为这两块: 1.界面