珠海网站制作哪家便宜,郑州手机网站建设多少钱,天元建设集团有限公司单位代码,天津市建设交易中心网站并发概念#xff1a;并发是指两个或多个事件在同一时间间隔发生#xff1b;多线程实现TCP并发服务器的实现流程#xff1a;一、创建套接字#xff08;socket函数#xff09;#xff1a;通信域选择IPV4网络协议、套接字类型选择流式#xff1b; int sockfd socket(AF_IN…并发概念并发是指两个或多个事件在同一时间间隔发生多线程实现TCP并发服务器的实现流程一、创建套接字socket函数通信域选择IPV4网络协议、套接字类型选择流式 int sockfd socket(AF_INET,SOCK_STREAM,0); //通信域选择IPV4、套接字类型选择流式二、填充服务器的网络信息结构体1.定义网络信息结构体变量2.求出结构体变量的内存空间大小3.结构体清零4.使用IPV4网络协议5.预留给在终端输入的IP地址6.预留给在终端输入的网络字节序的端口号 struct sockaddr_in serveraddr; //定义网络信息结构体变量socklen_t serveraddrlen sizeof(serveraddr);//求出结构体变量的内存空间大小memset(serveraddr,0,serveraddrlen); //结构体清零serveraddr.sin_family AF_INET; //使用IPV4网络协议serveraddr.sin_addr.s_addr inet_addr(argv[1]); //IP地址serveraddr.sin_port htons(atoi(argv[2]));//网络字节序的端口号三、套接字和服务器的网络信息结构体进行绑定bind函数 int ret bind(sockfd,(struct sockaddr *)serveraddr,serveraddrlen);四、套接字设置成被动监听listen函数 int ret1 listen(sockfd, 5);五、阻塞等待客户端的连接accept函数 if(-1 (info.accept_fd accept(sockfd,(struct sockaddr *)(info.clientaddr),clientaddr_len))){perror(accept error);exit(-1);}六、若有客户端连接成功就创建线程专门用来和该客户端通信pthread_create函数 if(0 ! (ret1 pthread_create(thread_id,NULL,message_handling,info))){printf(pthread_create error : errno [%d] errstr [%s]\n,ret1,strerror(ret1));exit(EXIT_FAILURE);}七、将线程设置成分离属性线程结束后由操作系统回收资源pthread_detach函数 if(0 ! (ret2 pthread_detach(thread_id))){printf(pthread_create error : errno [%d] errstr [%s]\n,ret2,strerror(ret2));exit(EXIT_FAILURE);}
八、创建线程处理函数用来接收来自客户端的数据recv函数和给客户端发送应答消息send函数 //线程处理函数void *message_handling(void *arg);int nbytes recv(acceptfd,buf,sizeof(buf),0);printf(客户端发来数据[%s]\n,buf);strcat(buf,----k); //组装应答消息int ret2 send(acceptfd,buf,sizeof(buf),0);九、退出线程pthread_exit函数和关闭套接字close函数 close(info.accept_fd);pthread_exit(NULL);综合应用实例代码如下所示
//多线程实现TCP并发服务器
#include stdio.h
#include stdlib.h
#include string.h
#include sys/types.h
#include sys/socket.h
#include pthread.h
#include stdbool.h
#include netinet/in.h
#include netinet/ip.h
#include arpa/inet.h
#include unistd.htypedef struct INFO
{int accept_fd;struct sockaddr_in clientaddr;}info_t;//线程处理函数
void *message_handling(void *arg);int main(int argc, char const *argv[])
{//入参合理性检查if(3 ! argc){printf(Usage : %s IP PORT\n,argv[0]);exit(-1);}//创建套接字int sockfd socket(AF_INET,SOCK_STREAM,0);if(-1 sockfd){perror(socket error);exit(-1);}//填充服务器网络信息结构体struct sockaddr_in serveraddr;socklen_t serveraddr_len sizeof(serveraddr);memset(serveraddr,0,serveraddr_len);serveraddr.sin_family AF_INET;serveraddr.sin_addr.s_addr inet_addr(argv[1]);serveraddr.sin_port htons(atoi(argv[2]));//将套接字与服务器网络信息结构体绑定if(-1 bind(sockfd,(struct sockaddr *)serveraddr,serveraddr_len)){perror(bind error);exit(-1);}//将套接字设置成被监听状态if(-1 listen(sockfd,5)){perror(listen error);exit(-1);}info_t info;pthread_t thread_id;int ret1 0;int ret2 0;socklen_t clientaddr_len sizeof(info.clientaddr);while(true){//等待客户端连接if(-1 (info.accept_fd accept(sockfd,(struct sockaddr *)(info.clientaddr),clientaddr_len))){perror(accept error);exit(-1);}//若有客户端连接成功就创建线程专门用来和该客户端通信if(0 ! (ret1 pthread_create(thread_id,NULL,message_handling,info))){printf(pthread_create error : errno [%d] errstr [%s]\n,ret1,strerror(ret1));exit(EXIT_FAILURE);}//将线程设置成分离属性线程结束后由操作系统回收资源if(0 ! (ret2 pthread_detach(thread_id))){printf(pthread_create error : errno [%d] errstr [%s]\n,ret2,strerror(ret2));exit(EXIT_FAILURE);}}close(sockfd);return 0;
}void *message_handling(void *arg)
{info_t info *(info_t *)arg;printf(客户端[%s : %d]连接到服务器\n,inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));//接收客户端数据并作出应答int nbytes 0;char buf[128] {0};while(true){memset(buf,0,sizeof(buf));//接收消息if(-1 (nbytes recv(info.accept_fd,buf,sizeof(buf),0))){perror(recv error);break;}else if(0 nbytes){printf(客户端[%s : %d]断开了连接\n,inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));break;}if(!strcmp(buf,quit)){printf(客户端[%s : %d]退出了\n,inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port));break;}printf(客户端[%s : %d]发来消息[%s]\n,inet_ntoa(info.clientaddr.sin_addr),ntohs(info.clientaddr.sin_port),buf);//组装应答strcat(buf,------k);//发送应答if(-1 send(info.accept_fd,buf,sizeof(buf),0)){perror(send error);break;}}close(info.accept_fd);pthread_exit(NULL);}本示例代码仅供参考