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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux select 实现并发服务器和客户端

發(fā)布時間:2023/11/30 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux select 实现并发服务器和客户端 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

轉(zhuǎn)載:http://blog.csdn.net/szkbsgy/article/details/10558881

[cpp]?view plaincopy
  • <span?style="font-size:18px;">服務(wù)端:??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<string.h>??
  • #include?<sys/time.h>??
  • #include?<sys/types.h>??
  • #include?<sys/socket.h>??
  • #include?<netinet/in.h>??
  • #include?<sys/select.h>??
  • #include?<errno.h>??
  • ??
  • ??
  • #define?SERVER_IP?"127.0.0.1"??
  • #define?SERVER_PORT?8000??
  • ??
  • ??
  • #define?MAX_RECV_LEN?1024??
  • #define?MAX_CLIENT_NUM?30??
  • #define?BACK_LOG?20??
  • ??
  • ??
  • static?int?running?=?1;??
  • ??
  • ??
  • int?main(int?argc,?char?*argv[])??
  • {??
  • ????int?sock_fd?=?-1;??
  • ????int?ret?=?-1;??
  • ????struct?sockaddr_in?serv_addr;??
  • ????struct?sockaddr_in?cli_addr;??
  • ????socklen_t?serv_addr_len?=?0;??
  • ????socklen_t?cli_addr_len?=?0;??
  • ????int?client_fd[MAX_CLIENT_NUM];??
  • ????char?recv_buf[MAX_RECV_LEN];??
  • ????int?new_conn_fd?=?-1;??
  • ????int?i?=?0;??
  • ????int?max_fd?=?-1;??
  • ????int?num?=?-1;??
  • ????struct?timeval?timeout;??
  • ??
  • ??
  • ????fd_set?read_set;??
  • ????fd_set?write_set;??
  • ????fd_set?select_read_set;??
  • ??
  • ??
  • ????FD_ZERO(&read_set);??
  • ????FD_ZERO(&write_set);??
  • ????FD_ZERO(&select_read_set);??
  • ??
  • ????for?(i?=?0;?i?<?MAX_CLIENT_NUM;?i++)??
  • ????{??
  • ????????client_fd[i]?=?-1;??
  • ????}???
  • ??
  • ????memset(&serv_addr,?0,?sizeof(serv_addr));??
  • ????memset(&cli_addr,?0,?sizeof(cli_addr));??
  • ??
  • ??
  • ????sock_fd?=?socket(AF_INET,?SOCK_STREAM,?0);??
  • ????if?(sock_fd?<?0)??
  • ????{??
  • ????????perror("Fail?to?socket");??
  • ????????exit(1);??
  • ????}??
  • ??
  • ??
  • ????serv_addr.sin_family?=?AF_INET;??
  • ????serv_addr.sin_port?=?htons(SERVER_PORT);??
  • ????serv_addr.sin_addr.s_addr?=?inet_addr(SERVER_IP);??
  • ??
  • ??
  • ????unsigned?int?value?=?1;??
  • ????if?(setsockopt(sock_fd,?SOL_SOCKET,?SO_REUSEADDR,??
  • ????????????????(void?*)&value,?sizeof(value))?<?0)??
  • ????{??
  • ????????perror("Fail?to?setsockopt");??
  • ????????exit(1);??
  • ????}??
  • ??
  • ??
  • ????serv_addr_len?=?sizeof(serv_addr);??
  • ????if?(bind(sock_fd,?(struct?sockaddr*)&serv_addr,?serv_addr_len)?<?0)??
  • ????{??
  • ????????perror("Fail?to?bind");??
  • ????????exit(1);??
  • ????}??
  • ????if?(listen(sock_fd,?BACK_LOG)?<?0)??
  • ????{??
  • ????????perror("Fail?to?listen");??
  • ????????exit(1);??
  • ????}??
  • ??
  • ????char?buf[1024];??
  • ????max_fd?=?sock_fd;??
  • ????int?len;??
  • ????FD_SET(sock_fd,?&read_set);??
  • ????while?(running)??
  • ????{??
  • ????????timeout.tv_sec?=?5;??
  • ????????timeout.tv_usec?=?0;??
  • ??
  • ??
  • ????????max_fd?=?sock_fd;??
  • ????????for?(i?=?0;?i?<?MAX_CLIENT_NUM;?i++)??
  • ????????{??
  • ????????????if?(max_fd?<?client_fd[i])??
  • ????????????{??
  • ????????????????max_fd?=?client_fd[i];??
  • ????????????}??
  • ????????}??
  • ??
  • ??
  • ????????select_read_set?=?read_set;??
  • ????????ret?=?select(max_fd?+?1,?&select_read_set,?NULL,?NULL,?&timeout);??
  • ????????if?(ret?==?0)??
  • ????????{??
  • ????????????printf("timeout\n");??
  • ????????}??
  • ????????else?if?(ret?<?0)??
  • ????????{??
  • ????????????printf("error?occur\n");??
  • ????????}??
  • ????????else??
  • ????????{??
  • ????????????if?(FD_ISSET(sock_fd,?&select_read_set))??
  • ????????????{??
  • ????????????????printf("new?client?comes\n");??
  • ????????????????len?=?sizeof(cli_addr);??
  • ????????????????new_conn_fd?=?accept(sock_fd,?(struct?sockaddr*)&cli_addr,?&len);??
  • ????????????????if?(new_conn_fd?<?0)??
  • ????????????????{??
  • ????????????????????perror("Fail?to?accept");??
  • ????????????????????exit(1);??
  • ????????????????}??
  • ????????????????else??
  • ????????????????{??
  • ????????????????????for?(i?=?0;?i?<?MAX_CLIENT_NUM;?i++)??
  • ????????????????????{??
  • ????????????????????????if?(client_fd[i]?==?-1)??
  • ????????????????????????{??
  • ????????????????????????????client_fd[i]?=?new_conn_fd;??
  • ????????????????????????????FD_SET(new_conn_fd,?&read_set);??
  • ????????????????????????????break;??
  • ????????????????????????}??
  • ????????????????????????if?(max_fd?<?new_conn_fd)??
  • ????????????????????????{??
  • ????????????????????????????max_fd?=?new_conn_fd;??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ????????????else??
  • ????????????{??
  • ????????????????for?(i?=?0;?i?<?MAX_CLIENT_NUM;?i++)??
  • ????????????????{??
  • ????????????????????if?(-1?==?client_fd[i])?{??
  • ????????????????????????continue;??
  • ????????????????????}??
  • ????????????????????memset(recv_buf,?0,?MAX_RECV_LEN);??
  • ????????????????????if?(FD_ISSET(client_fd[i],?&select_read_set))??
  • ????????????????????{??
  • ????????????????????????num?=?read(client_fd[i],?recv_buf,?MAX_RECV_LEN);??
  • ????????????????????????if?(num?<?0)??
  • ????????????????????????{??
  • ????????????????????????????printf("Client(%d)?left\n",?client_fd[i]);??
  • ????????????????????????????FD_CLR(client_fd[i],?&read_set);??
  • ????????????????????????????close(client_fd[i]);??
  • ????????????????????????????client_fd[i]?=?-1;??
  • ????????????????????????}??
  • ????????????????????????else?if?(num?>?0)??
  • ????????????????????????{??
  • ????????????????????????????recv_buf[num]?=?'\0';??
  • ????????????????????????????printf("Recieve?client(%d)?data\n",?client_fd[i]);??
  • ????????????????????????????printf("Data:?%s\n\n",?recv_buf);??
  • ????????????????????????}?if?(num?==?0)??
  • ????????????????????????{??
  • ????????????????????????????printf("Client(%d)?exit\n",?client_fd[i]);??
  • ????????????????????????????FD_CLR(client_fd[i],?&read_set);??
  • ????????????????????????????close(client_fd[i]);??
  • ????????????????????????????client_fd[i]?=?-1;??
  • ????????????????????????}??
  • ????????????????????}??
  • ????????????????}??
  • ????????????}??
  • ????????}??
  • ????}??
  • ????return?0;??
  • }??
  • ??
  • 客戶端:??
  • #include?<stdio.h>??
  • #include?<stdlib.h>??
  • #include?<string.h>??
  • #include?<unistd.h>??
  • #include?<sys/time.h>??
  • #include?<sys/types.h>??
  • #include?<sys/socket.h>??
  • #include?<netinet/in.h>??
  • #include?<sys/select.h>??
  • ??
  • ??
  • #define?SERVER_IP?"127.0.0.1"??
  • #define?SERVER_PORT?8000??
  • ??
  • ??
  • #define?MAX_RECV_LEN?1024??
  • ??
  • ??
  • static?int?running?=?1;??
  • ??
  • ??
  • int?main(int?argc,?char?*argv[])??
  • {??
  • ????int?sock_fd?=?-1;??
  • ????int?ret?=?-1;??
  • ????struct?sockaddr_in?serv_addr;??
  • ????struct?sockaddr_in?cli_addr;??
  • ????socklen_t?serv_addr_len?=?0;??
  • ??
  • ????memset(&serv_addr,?0,?sizeof(serv_addr));??
  • ??
  • ??
  • ????sock_fd?=?socket(AF_INET,?SOCK_STREAM,?0);??
  • ????if?(sock_fd?<?0)??
  • ????{??
  • ????????perror("Fail?to?socket");??
  • ????????exit(1);??
  • ????}??
  • ??
  • ??
  • ????serv_addr.sin_family?=?AF_INET;??
  • ????serv_addr.sin_port?=?htons(SERVER_PORT);??
  • ????serv_addr.sin_addr.s_addr?=?inet_addr(SERVER_IP);??
  • ??
  • ??
  • ????serv_addr_len?=?sizeof(serv_addr);??
  • ????if?(connect(sock_fd,?(struct?sockaddr?*)&serv_addr,?serv_addr_len)?<?0)??
  • ????{??
  • ????????perror("Fail?to?connect");??
  • ????????exit(1);??
  • ????}??
  • ????char?buf[1024];??
  • ????int?num?=?0;??
  • ????while?(running)??
  • ????{??
  • ????????num?=?read(STDIN_FILENO,?buf,?MAX_RECV_LEN);??
  • ????????if?(num?>?0)??
  • ????????{??
  • ????????????buf[num]?=?'\0';??
  • ????????????printf("buf:?%s\n",?buf);??
  • ????????????num?=?write(sock_fd,?buf,?num);??
  • ????????????if?(num?<?0)??
  • ????????????{??
  • ????????????????printf("write?failed\n");??
  • ????????????????exit(1);??
  • ????????????}??
  • ??
  • ??
  • ????????????if?(strncmp(buf,?"exit",?strlen("exit"))?==?0)??
  • ????????????{??
  • ????????????????printf("Client?exit\n");??
  • ????????????????close(sock_fd);??
  • ????????????????return?0;??
  • ????????????}???
  • ????????}??
  • ????}??
  • ????return?0;??
  • }?</span>??
  • 0

    總結(jié)

    以上是生活随笔為你收集整理的Linux select 实现并发服务器和客户端的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。