Linux——回射服务器多并发(多线程)
生活随笔
收集整理的這篇文章主要介紹了
Linux——回射服务器多并发(多线程)
小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.
多線程與多進程的做法區(qū)別不大,思路一樣,都是執(zhí)行兩個死循環(huán),一個循環(huán)等待客戶端連接,一個循環(huán)與客戶端通信。多進程的方式請點此處
服務器
#include <sys/socket.h> #include <pthread.h> #include <unistd.h> #include <arpa/inet.h> #include <stdio.h> #include <string.h> #include <netinet/in.h> #include <sys/types.h>typedef struct client_new {char *ip_addr;int sockid; }client_new;//存放當前客戶端信息void *do_work(void *client_) {client_new client=*((client_new *)client_);//強轉char receive[100]={0};while(1){memset(receive,0,sizeof(receive));int ret=read(client.sockid,receive,sizeof(receive));//socket作為文件描述符默認為阻塞,當客戶端關閉時立即返回0if(ret==0){printf("%s 客戶端已關閉\n",client.ip_addr);pthread_exit(NULL);}printf("%s :",client.ip_addr);fputs(receive,stdout);write(client.sockid,receive,ret);} } int main() {int client_sockid=0;struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=htonl(INADDR_ANY);int sockid=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);const int on=1;if(setsockopt(sockid,SOL_SOCKET,SO_REUSEADDR,&on,sizeof(on))<0)//設置端口重復利用{printf("setsockopt\n");return 0;}if(bind(sockid,(struct sockaddr *)&sock,sizeof(sock))<0){printf("bind\n");return 0;}if(listen(sockid,SOMAXCONN)<0){printf("listen\n");return 0;}struct sockaddr_in client_sockaddr;socklen_t other_socklen=sizeof(client_sockaddr);pthread_t tid=0;while(1){client_sockid=accept(sockid,(struct sockaddr *)&client_sockaddr,&other_socklen);//如果沒有客戶端連接,accept就阻塞在這里if(client_sockid<0){continue;}client_new client;client.ip_addr=inet_ntoa(client_sockaddr.sin_addr);client.sockid=client_sockid;printf("ip=%s port=%d 已連接\n",inet_ntoa(client_sockaddr.sin_addr),ntohs(client_sockaddr.sin_port));pthread_create(&tid,NULL,do_work,(void *)&client);//創(chuàng)建線程,只要有客戶端連接就創(chuàng)建一個線程去和客戶端通信}close(sockid);return 0; }客戶端
#include <stdio.h> #include <string.h> #include <unistd.h> #include <sys/socket.h> #include <netinet/in.h>int main() {struct sockaddr_in sock;memset(&sock,0,sizeof(sock));sock.sin_family=AF_INET;sock.sin_port=htons(5188);sock.sin_addr.s_addr=inet_addr("127.0.0.1");int sockid=socket(PF_INET,SOCK_STREAM,IPPROTO_TCP);socklen_t socklen=sizeof(sock);if(connect(sockid,(struct sockaddr *)&sock,socklen)<0){printf("connect\n");return 0;}char send[100]={0};char receive[100]={0};while(1) {fgets(send,sizeof(send),stdin);if(strcmp(send,"NULL\n")==0)//輸入NULL退出客戶端{break;}write(sockid,send,strlen(send));read(sockid,receive,sizeof(receive));fputs(receive,stdout);memset(receive,0,strlen(receive));memset(send,0,strlen(send));}close(sockid);return 0; }總結
以上是生活随笔為你收集整理的Linux——回射服务器多并发(多线程)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法设计TSP问题动态规划
- 下一篇: 大二上数据结构复习