- 1、本文档共9页,可阅读全部内容。
- 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
.用select实现TCP并发服务器
介绍:运行在ubuntu linux系统,需要先打开一个终端运行服务端代码,这时,可以打开多个终端同时运行多个客户端代码(注意客户端数目要小于MAX_FD);在客户端输入数据后回车,可以看见服务器收到数据,并回复客户端确认信息,客户端输入:exit,按回车,该客户端关闭,在服务器端显示退出信息;所有客户端关闭后,服务器不会自动关闭,需要按ctrl+c强制关闭。
服务器端代码:
#include stdio.h
#include unistd.h#include stdlib.h#include errno.h#include string.h#include sys/socket.h#include sys/types.h#include netinet/in.h#include arpa/inet.h#include sys/select.h#define SERV_PORT 8888#define SERV_IP 127.0.0.1 //本地回环接口#define LIST 20 //服务器最大接受连接#define MAX_FD 10 //FD_SET支持描述符数量int main(void){ int sockfd; int err; int i; int connfd; int fd_all[MAX_FD]; //保存所有描述符,用于select调用后,判断哪个可读
//下面两个备份原因是select调用后,会发生变化,再次调用select前,需要重新赋值
fd_set fd_read; //FD_SET数据备份
fd_set fd_select; //用于select struct timeval timeout; //超时时间备份 struct timeval timeout_select; //用于select struct sockaddr_in serv_addr; //服务器地址 struct sockaddr_in cli_addr; //客户端地址 socklen_t serv_len; socklen_t cli_len; //超时时间设置 timeout.tv_sec = 10; timeout.tv_usec = 0; sockfd = socket(AF_INET, SOCK_STREAM, 0); if(sockfd 0) { perror(fail to socket); exit(1);
} memset(serv_addr, 0, sizeof(serv_addr)); memset(cli_addr, 0, sizeof(cli_addr)); serv_addr.sin_family = AF_INET; serv_addr.sin_port = htons(SERV_PORT); serv_addr.sin_addr.s_addr = inet_addr(SERV_IP); serv_len = sizeof(serv_addr); err = bind(sockfd, (struct sockaddr *)serv_addr, serv_len); if(err 0) { perror(fail to bind); exit(1); } err = listen(sockfd, LIST);
if(err 0) { perror(fail to listen); exit(1); } //初始化fd_all数组 memset(fd_all, -1,
文档评论(0)