linux——TCP多线程并发服务器
多线程服务器 可以同时处理多个客户端旧版一次只能接一个客户客户不走别人连不进来。新版来一个客户创建一个线程专门服务同时支持 N 个客户端主函数加了一个while(1)循环pthread_t tid; int newfd -1; struct sockaddr_in cin; socklen_t addrlen sizeof(cin); while(1) { newfd accept(fd,(struct sockaddr *)cin,addrlen); if(newfd 0) { perror(accept); exit(1); } char ipv4_addr[16]; if(!inet_ntop(AF_INET,(void *)cin.sin_addr,ipv4_addr,sizeof(cin))) { perror(inet_ntop); exit(1); } printf(Client:(%s,%d) is connect\n,ipv4_addr,ntohs(cin.sin_port)); pthread_create(tid,NULL,client_data_handle,(void *)newfd); }就是无线循环accept函数accept 接到一个客户 → 立刻创建一个线程去服务它 → 主线程马上回去继续等下一个客户创建线程pthread_create(tid, NULL, client_data_handle, (void *)newfd);让这个线程去执行client_data_handle函数专门服务当前这个客户端主线程马上回去继续 accept 等下一个客户线程函数用来接收数据代码void* client_data_handle(void* arg) { int newfd *(int *)arg; char buf[BUFSIZE]; int ret -1; printf(handle thread :newfd %d\n,newfd); while(1) { do { bzero(buf,BUFSIZE); ret read(newfd,buf,BUFSIZE-1); }while(ret 1); if(ret 0) { exit(1); } if(!ret) { break; } printf(receive data:%s\n,buf); if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))) { printf(Client is exiting!\n); break; } } close(newfd); return NULL; }每个客户端都由一个独立的线程服务同时也把客户端代码优化一下以前的客户端代码IP地址和端口号是写死的我们改成命令行传参int main(int argc, char **argv) { port atoi(argv[2]); sin.sin_addr.s_addr inet_addr(argv[1]); }这样客户端更灵活相连接不同的服务器不用总是修改代码想连谁在终端输入对应的IP地址和端口号就行服务器端#includestdio.h #include sys/types.h /* See NOTES */ #include sys/socket.h #include unistd.h #includestdlib.h #include strings.h #include arpa/inet.h #includestring.h #include pthread.h #define QUIT_STR QUIT #define BUFSIZE 1024 #define BACKLOG 5 #define SERV_IP 5001 #define SERV_IP_ADDR 192.168.88.129 void* client_data_handle(void* arg); int main() { int fd -1; struct sockaddr_in sin; //1.socket fd socket(AF_INET,SOCK_STREAM,0); if(fd0) { perror(socket); exit(1); } bzero(sin,sizeof(sin)); sin.sin_family AF_INET; sin.sin_port htons(SERV_IP); //sin.sin_addr.s_addr inet_addr(SERV_IP_ADDR); sin.sin_addr.s_addr INADDR_ANY; /*if(inet_pion(AF_INET,SERV_IP_ADDR,(void *)sin.sin_addr.s_addr) ! 1) { perror(inet_pton); exit(1); } */ //2.bind if(bind(fd,(struct sockaddr *)sin,sizeof(sin)) 0) { perror(bind); exit(0); } //3.listen if(listen(fd,BACKLOG) 0) { perror(listen); exit(1); } //4.accept /*int newfd -1; newfd accept(fd,NULL,NULL); if(newfd 0) { perror(accept); exit(1); } */ pthread_t tid; int newfd -1; struct sockaddr_in cin; socklen_t addrlen sizeof(cin); while(1) { newfd accept(fd,(struct sockaddr *)cin,addrlen); if(newfd 0) { perror(accept); exit(1); } char ipv4_addr[16]; if(!inet_ntop(AF_INET,(void *)cin.sin_addr,ipv4_addr,sizeof(cin))) { perror(inet_ntop); exit(1); } printf(Client:(%s,%d) is connect\n,ipv4_addr,ntohs(cin.sin_port)); pthread_create(tid,NULL,client_data_handle,(void *)newfd); } close(fd); return 0; } void* client_data_handle(void* arg) { int newfd *(int *)arg; char buf[BUFSIZE]; int ret -1; printf(handle thread :newfd %d\n,newfd); while(1) { do { bzero(buf,BUFSIZE); ret read(newfd,buf,BUFSIZE-1); }while(ret 1); if(ret 0) { exit(1); } if(!ret) { break; } printf(receive data:%s\n,buf); if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))) { printf(Client is exiting!\n); break; } } close(newfd); return NULL; }客户端#includestdio.h #includestdlib.h #includestring.h #includestrings.h #includeunistd.h #include sys/types.h /* See NOTES */ #include sys/socket.h #include arpa/inet.h // ./client 192.168.88.129 5001 #define SERV_PORT 5001 #define SERV_IP_ADDR 192.168.88.129 #define BUFSIZE 1024 #define QUIT_STR QUIT int main(int argc,char **argv) { int fd -1; if(argc ! 3) { exit(1); } int port -1; port atoi(argv[2]); struct sockaddr_in sin; fd socket(AF_INET,SOCK_STREAM,0); if(fd 0) { perror(socket); exit(1); } bzero(sin,sizeof(sin)); sin.sin_family AF_INET; sin.sin_port htons(port); sin.sin_addr.s_addr inet_addr(argv[1]); if(connect(fd,(struct sockaddr*)sin,sizeof(sin)) 0) { perror(connect); exit(1); } char buf[BUFSIZE]; while(1) { bzero(buf,BUFSIZE); if(fgets(buf,BUFSIZE-1,stdin) NULL) { continue; } write(fd,buf,strlen(buf)); if(!strncasecmp(buf,QUIT_STR,strlen(QUIT_STR))) { break; } } return 0; }成功实现了
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2511567.html
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!