日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

实现Linux select IO复用C/S服务器代码

發布時間:2023/11/30 linux 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 实现Linux select IO复用C/S服务器代码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
服務器端#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/stat.h> #include<arpa/inet.h> #include <sys/select.h>#define MAXBUF 256 #define MAXLISTEN 8 #define PORT 8888struct msgtemp { int num; char *s; };int main() { int clen,dirnum,opt=1,i,nbyte; int listenfd,clientfd,maxfd; int client[FD_SETSIZE];struct sockaddr_in client_addr,server_addr; char readbuf[MAXBUF],writebuf[MAXBUF]; struct msgtemp msg[FD_SETSIZE]; fd_set rset, allset;if((listenfd=socket(AF_INET,SOCK_STREAM,0))<0){ perror("socket error:"); exit(1); } clen = sizeof(client_addr); bzero(&server_addr,0); server_addr.sin_family =AF_INET; server_addr.sin_addr.s_addr=htonl(INADDR_ANY); server_addr.sin_port=htons(PORT);setsockopt(listenfd,SOL_SOCKET,SO_REUSEADDR,(char*)&opt,sizeof(opt)); if(bind(listenfd,(struct sockaddr *)&server_addr,sizeof(server_addr))<0){ perror("bind error"); exit(1); } if(listen(listenfd,MAXLISTEN)<0){ perror("listen error:"); exit(1); }maxfd = listenfd; for (i = 0; i < FD_SETSIZE; i++) client[i] = -1;FD_ZERO(&allset); FD_SET(listenfd, &allset);while(1){ rset = allset; if(select(maxfd+1, &rset, NULL, NULL, NULL)<0) { perror("select"); return -1; } if (FD_ISSET(listenfd, &rset)) { /* 是否有新的連接進來*/ clientfd=accept(listenfd,(struct sockaddr *)&client_addr,&clen); if(clientfd < 0) { perror("accept"); } printf("new connection fd = %d\n",clientfd); FD_SET(clientfd, &allset); maxfd = clientfd > maxfd ? clientfd : maxfd; for (i = 0; i < FD_SETSIZE; i++) if (client[i] < 0) { client[i] = clientfd; break; } } for (i = 0; i < FD_SETSIZE; i++) { if (FD_ISSET(client[i], &rset)) { if ( (nbyte = read(client[i], readbuf, MAXBUF)) < 0) { perror("read"); continue;} else if (nbyte ==0) { close(client[i]); FD_CLR(client[i], &allset); printf("connection fd = %d closed\n",client[i]); client[i] = -1; msg[i].num =0; msg[i].s = NULL;} else{ printf("recv msg from fd = %d : %s\n",client[i],readbuf);msg[i].s = readbuf; sprintf(writebuf,"%03d : %s",msg[i].num,msg[i].s); write(client[i], writebuf, strlen(writebuf)+1); msg[i].num ++; }} }} return 0; }客戶端#include<stdio.h> #include<unistd.h> #include<stdlib.h> #include<string.h> #include<sys/socket.h> #include<sys/stat.h> #include<arpa/inet.h> #include<fcntl.h>#define MAXBUF 256 #define PORT 8888int main() { int ssock; int clen,readbytes,fd2,i; struct sockaddr_in server_addr; char writebuf[MAXBUF],readbuf[MAXBUF],file_path[MAXBUF];if((ssock=socket(AF_INET,SOCK_STREAM,0))<0){ perror("socket error:"); exit(1); } clen = sizeof(server_addr); bzero(&server_addr,0); server_addr.sin_family =AF_INET; server_addr.sin_addr.s_addr=inet_addr("127.0.0.1"); server_addr.sin_port =htons(PORT); if(connect(ssock,(struct sockaddr *)&server_addr,clen)<0){ perror("connect error:"); exit(1); }while(1) { printf("input msg:"); fgets(writebuf,MAXBUF,stdin); if(write(ssock,writebuf,MAXBUF)<0) { perror("write error:"); }readbytes=read(ssock,readbuf,MAXBUF); if( readbytes <0 ) {perror("read error:"); exit(1); } if( readbytes ==0 ) { printf("connection closed \n"); break; }printf("%s\n",readbuf); }close(ssock);return 0; }

?

總結

以上是生活随笔為你收集整理的实现Linux select IO复用C/S服务器代码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。