网络IO与IO多路复用基础(上)网络IO作用 : 解决数据的发送与接受总目标 : 实现一个TCPserver有多个client连接并发的传输信息phase 1 一个server连接一个client用到的工具 :基础语法实现一个简单server// 创建 net IOintsockfdsocket(AF_INET,SOCK_STREAM,0);// 服务器地址structsockaddr_inserver_addr{0};server_addr.sin_familyAF_INET;server_addr.sin_porthtons(2000);server_addr.sin_addr.s_addrhtonl(INADDR_ANY);// 监听所有网卡socklen_tserv_addr_lensizeof(structsockaddr_in);if(bind(sockfd,(structsockaddr*)server_addr,serv_addr_len)0){return-1;}if(listen(sockfd,5)0){return-2;}这里如果爆出错误这段端口被绑定了 , 换一个端口就可以 , 从 0 ~ 1023 是系统默认端口 , 所以选择一个1024及以上的就可以实现一个简单clientfd 也就是 client端IOstructsockaddr_inclient_addr;socklen_tclient_addr_lensizeof(structsockaddr_in);printf(wait accept \n);intclient_fdaccept(sockfd,(structsockaddr*)client_addr,client_addr_len);printf(accept finish\n);charbuffer[BUFFER_SIZE];recv(client_fd,buffer,BUFFER_SIZE,0);printf(recv : %s,buffer);我们在这里可以使用 sudo netstat -antp | grep 2000 查看多加几个连接从这里的 LISTEN CLOSE_WAIT ESTABLISHED 可以看出 ,一个 listenfd 可以持续 accept生成很多个独立 connfd每个 connfd 对应一个客户端 TCP 连接 , 但是发送接收消息只能与建立连接的来做如何解决?我们每来一个新的accept都可以创建一个新的线程来处理基础语法while(1){structsockaddr_inclient_addr;socklen_tclient_addr_lensizeof(structsockaddr_in);printf(wait accept \n);int*p_connfdmalloc(sizeof(int));// 分配内存保存fd解决竞态*p_connfdaccept(sockfd,(structsockaddr*)client_addr,client_addr_len);printf(accept finish \n);pthread_t*threadid(pthread_t*)malloc(sizeof(pthread_t*));pthread_create(threadid,NULL,client_recv,p_connfd);}还有回调函数 Callbackvoid*client_recv(void*arg){intp_connfd*(int*)arg;while(1){charbuffer[BUFFER_SIZE];memset(buffer,0,BUFFER_SIZE);intcountrecv(p_connfd,buffer,BUFFER_SIZE,0);printf(recv : %s \n,buffer);send(p_connfd,buffer,count,0);printf(send finish \n);}}我们再一次用三个客户端连接于是发现用 netstat命令也可以看到这里都变成了 ESTABLISHED到此我们可以总结出这几条结论也就是 :同一个端口只能被绑定一次 , 当然还有别的机制可以解决这个问题listenfd只要进入listen就可以产生新的连接状态fd 与 TCP 连接信息一一对应 , 有几个client连接就有几个 fd 句柄到这里就实现了一请求一线程优点 : 简单缺点 : 就算没有数据也需要创建一个持续等待的线程所以存在一个问题 : 为什么要为每个暂时没有数据的 Socket 分配一个专门等待的线程socket 就是一个网络通信接口 , 也就是如果要使用这个网络通信能力就接上这个接口就可以了希望大家指出问题 , 感谢!