水平触发或边缘触发?

时间:2016-06-03 16:53:23

标签: c linux sockets epoll

我有一个服务器应用程序,它监听端口,接受(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加上有限状态来跟踪步骤。

如果边缘触发选项出错,请纠正我。任何的想法?

1 个答案:

答案 0 :(得分:3)

epoll_wait报告套接字准备好读取之前,似乎无法设置传入套接字缓冲区中可用的最小字节数。

man socket(7)

  

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字节可用。

除非手册页已过期。