我有一个服务器应用程序,它监听端口,接受(TCP)对等连接,然后为每个套接字
1)reads
(不超过30个字节的数据)
2)sends
(1字节确认)
3)reads
(不超过2K)
4)sends
(1字节确认)
5)closes
(连接)
我在我的应用程序中使用epoll
循环。我希望epoll_wait
返回(带有EPOLLIN标志的事件列表)仅当来自对等体的所有数据时,才能通过单个read/recv
调用数组来读取。如果在某个套接字fd上没有收到所有数据,我不希望epoll
将此fd添加到事件列表中。
据我了解epoll
的水平触发和边缘触发模式之间的差异,可以使用带有非阻塞套接字的边缘触发epoll
加上有限状态来跟踪步骤。
如果边缘触发选项出错,请纠正我。任何的想法?
答案 0 :(得分:3)
在epoll_wait
报告套接字准备好读取之前,似乎无法设置传入套接字缓冲区中可用的最小字节数。
SO_RCVLOWAT和SO_SNDLOWAT
指定缓冲区中的最小字节数,直到套接字层将数据传递给协议(SO_SNDLOWAT)或接收用户(SO_RCVLOWAT)。这两个值初始化为1.在Linux上,SO_SNDLOWAT不可更改(setsockopt(2)因ENAPROTOOPT错误而失败)。 SO_RCVLOWAT仅在Linux 2.4之后才可更改。 select(2)和poll(2)系统调用当前不遵循Linux上的SO_RCVLOWAT设置,并且即使单个数据字节可用时也标记套接字可读。随后从套接字读取将阻塞直到SO_RCVLOWAT字节可用。
除非手册页已过期。