级别触发或边缘触发?

我有一个服务器应用程序,监听端口,接受(TCP)对等连接,然后为每个套接字

1) reads (不超过30字节的数据)

2) sends (1字节ack)

3) reads (不超过2K)

4) sends (1字节ack)

5) closes (连接)

我在我的应用程序中使用epoll循环。 我希望epoll_wait 只有当所有的数据从对等体到达时才返回(带有EPOLLIN标志的事件列表),这样我才能读取一个read/recv调用到数组中。 如果所有的数据都没有收到一个特定的套接字fd我不希望epoll添加这个fd到事件列表。

据我所知epoll水平触发和边缘触发模式之间的差异,这种行为可以达到使用边缘触发epoll与非阻塞套接字加上有限状态来跟踪步骤。

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

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

男人插座(7) :

SO_RCVLOWAT和SO_SNDLOWAT

指定缓冲区中的最小字节数,直到套接字层将数据传递给协议(SO_SNDLOWAT)或接收用户(SO_RCVLOWAT)。 这两个值初始化为1. SO_SNDLOWAT在Linux上不可更改(setsockopt(2)因错误ENOPROTOOPT而失败)。 从Linux 2.4开始,SO_RCVLOWAT是可以改变的。 select(2)和poll(2)系统调用目前不遵循Linux上的SO_RCVLOWAT设置,并且即使只有一个字节的数据可用时也将套接字标记为可读。 从套接字的后续读取将阻塞,直到SO_RCVLOWAT字节可用。

除非手册页已过期。