(P17)socket编程(十二)
1.select限制
命令:
ulimit -n 2048,进程打开的文件描述符的数量
编程:
头文件中定义的
而且需要重新编译内核
客户端没有sleep
服务端
客户端
客户端加了sleep
服务端:
客户端:
客户端
0 1 2已经被标准输入,标准输出,标准错误输出所占用
1021个连接
创建第1022个套接字的时候失败了,客户端sleep(4),就不会发送FIN段给对方了
服务端
收到这1021个连接,会在已完成连接队列中维护1021个条目,若客户端没有sleep(4),可能还有300个fd没有处理,此时创建第1022个套接字的时候失败了,失败了就意味着退出进程,导致客户端发送了FIN段给服务端,而此时服务端还没有完全接受连接,所以有可能先收到了客户端的FIN段,所以会出现client close和accept混在一起了
没有sleep的服务端解释:
close已经收到了,但是已完成连接队列还没有完全接收完,一旦套接字关闭,就能腾出来足够的文件描述符来接受连接了,所以这里的1021并不代表有1021个并发,因为有一些客户端已经关闭了,所以客户端有个sleep(4)。
有sleep的客户端解释:
为啥客户端是1020个并发?
除了0,1,2外,还有监听套接字3,所以并发数量为1024-4=1020.
当fd为1021时,创建套接字就会失败,因为超出了进程创建的fd的限制,所以显示Too many open files
2.poll:与select差不多
关心的套接口以及事件,通常指向一个数组;
加入到该数组中的io的个数;
超时时间;
要请求的事件
返回的事件
ulimit -n 2048
服务端:去掉0,1,2,监听fd,为2048-4=2044
客户端:去掉0,1,2,为2048-3=2045,即打开2045个fd
结构体中的events
与select的可读事件相对应
与select的紧急事件相对应
与select的可写事件相对应