问: 服务端用epoll 模型 , 客户端连接服务端发送大量udp 数据包, 经过一段时间后, 再次发送udp 数据包时,服务端收不到包,(或者说大量tcp连接服务端,服务端会丢失连接),为何?
答:1. 在服务端,用 ss -lu 查看 对应进程的recv-Q 是否占满
当 Recv-Q 可以理解为 对应进程socket 的接收缓存队列,系统维护,如果占满,系统会丢弃数据包。 可dmesg 查看相应系统日志。
- 将epoll 模型的接收触发方式改为 低电平触发(水平触发) , 即epoll 模型的默认触发方式。
struct epoll_event ev;
ev.events= EPOLLIN;
epoll 模型有两种触发方式:
一种叫好比拉尿,拉尿的时候都是一次拉完,只要膀胱中还有尿,就一直拉。这就是epoll 模型中的EPOLLLT (水平触发)模式,只要缓冲区里有数据,就一直触发,(应用)赶快处理。
一种叫拉屎, 你完全可以拉到一半,然后提裤子走人,去接个电话。过一会儿,可能又有了拉屎的欲望, 再去拉屎。这就是epoll 模型中的EPOLLET(边沿触发)模式,当两个网络包同时到达时,只触发一次。