(P17)socket编程(十二)

1.select限制

(P17)socket编程(十二)
命令:
ulimit -n 2048,进程打开的文件描述符的数量

(P17)socket编程(十二)
编程:

头文件中定义的
而且需要重新编译内核

客户端没有sleep
服务端
(P17)socket编程(十二)
客户端
(P17)socket编程(十二)

客户端加了sleep
服务端:
(P17)socket编程(十二)
客户端:
(P17)socket编程(十二)

客户端
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差不多

(P17)socket编程(十二)
关心的套接口以及事件,通常指向一个数组;
加入到该数组中的io的个数;
超时时间;

(P17)socket编程(十二)
要请求的事件
返回的事件

(P17)socket编程(十二)

ulimit -n 2048
服务端:去掉0,1,2,监听fd,为2048-4=2044
(P17)socket编程(十二)
客户端:去掉0,1,2,为2048-3=2045,即打开2045个fd
(P17)socket编程(十二)

结构体中的events
(P17)socket编程(十二)
与select的可读事件相对应
与select的紧急事件相对应
与select的可写事件相对应