linux网络编程之socket(十二) select函数的并发限制和poll函数应用举例
输出 太多条目,上面只截取最后几条,从中可以看出对于客户端,最多只能开启1021个连接套接字,因为总共是1024个,还得除 去0,1,2。而服务器端只能accept 返回1020个已连接套接字,因为除了012之外还有一个监听套接字,客户端某一个套接 字(不一定是最后一个)虽然已经建立了连接,在已完成连接队列中,但accept 返回时达到最大描述符限制,返回错误, 打印提示信息。 也许有人会注意到上面有一行 sleep(4); 当客户端调用socket准备创建第1022个套接字时,如上所 示也会提示错误,此时socket函数返回-1出错,如果没有睡眠4s后再退出进程会有什么问题呢?如果直接退出进程,会将客 户端所打开的所有套接字关闭掉,即向服务器端发送了很多FIN段,而此时也许服务器端还一直在accept ,即还在从已连接 队列中返回已连接套接字,此时服务器端除了关心监听套接字的可读事件,也开始关心前面已建立连接的套接字的可读事件 ,read 返回0,所以会有很多 client close 字段 参杂在条目的输出中,还有个问题就是,因为read 返回0,服务器端会 将自身的已连接套接字关闭掉,那么也许刚才说的客户端某一个连接会被accept 返回,即测试不出服务器端真正的并发容 量。 将 sleep(4); 注释掉,观察服务器端的输出如下: simba@ubuntu:~/Documents/code/linux_programming/UNP/socket$ ./echoser_select ........................................................... count = 1018 recv connect ip=127.0.0.1 port=52323 client close count = 1019 recv connect ip=127.0.0.1 port=52324 client close count = 1020 recv connect ip=127.0.0.1 port=52325 client close count = 1021 recv connect ip=127.0.0.1 port=52234 client close client close 可以看到输出参杂着client close,且这次的count 达到了1021,原因就是服务器端前面已经有些套接字关闭了,所以accept 创建套接字不会出错,服务器进程也不会因为出 错而退出,可以看到最后接收到的一个连接端口是52234,即不一定是客户端的最后一个连接。 二、poll 函数应用 举例 #include <poll.h> int poll(struct pollfd *fds, nfds_t nfds, int timeout); 参数1: 结构体数组指针,struct pollfd { int fd; /* file descriptor */ short events; /* requested events */ short revents; /* returned events */ }; 结构体中的fd 即套 接字描述符,events 即感兴趣的事件,如下图所示,revents 即返回的事件。 (编辑:温州站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |