C 水平触发还是边缘触发?

C 水平触发还是边缘触发?,c,linux,sockets,epoll,C,Linux,Sockets,Epoll,我有一个服务器应用程序,它监听一个端口,接受TCP对等连接,然后为每个套接字连接它 1读取的数据不超过30字节 2发送1字节应答 3的读数不超过2K 4发送1字节的应答 5关闭连接 我在应用程序中使用epoll循环。我希望epoll_wait仅在所有数据从对等方到达时才返回带有EPOLLIN标志的事件列表,这样我就可以通过对数组的单个read/recv调用进行读取。如果尚未在某个套接字fd上接收到所有数据,我不希望epoll将此fd添加到事件列表中 据我所知,epoll的电平触发模式和边缘触发模

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

1读取的数据不超过30字节

2发送1字节应答

3的读数不超过2K

4发送1字节的应答

5关闭连接

我在应用程序中使用epoll循环。我希望epoll_wait仅在所有数据从对等方到达时才返回带有EPOLLIN标志的事件列表,这样我就可以通过对数组的单个read/recv调用进行读取。如果尚未在某个套接字fd上接收到所有数据,我不希望epoll将此fd添加到事件列表中

据我所知,epoll的电平触发模式和边缘触发模式之间存在差异。使用具有非阻塞套接字的边缘触发epoll加上有限状态来跟踪步骤,可以实现此行为


如果边缘触发选项有误,请更正。有什么想法吗

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

:

如此这般

指定缓冲区中的最小字节数,直到套接字层在接收SO_RCVLOWAT时将数据传递给协议SO_SNDLOWAT或用户。这两个值被初始化为1。因此,Linux上的_SNDLOWAT是不可更改的,setsockopt2失败,错误为InProtoop。因此,_RCVLOWAT仅在Linux2.4之后才可更改。select2和poll2系统调用目前不符合Linux上的SO_RCVLOWAT设置,并且在只有一个字节的数据可用时,将套接字标记为可读。从套接字进行的后续读取将阻塞,直到SO_RCVLOWAT字节可用为止


除非手册页已过期。

您的意思是,无论是级别还是边缘触发模式,我都可能只读取,比如1K部分读取,然后稍后我将不得不读取其余数据,比如1K?@fade2black确切地说,当至少有1个字节可用时,他们会报告套接字准备读取。这是TCP,八位字节/字节流协议。它不能传输长度超过一个字节的消息。因此,在边缘触发模式下,到达的数据只被通知一次,我必须读取它,因为下次epoll_wait不会通知我。用水平仪怎么样?每次epoll_等待返回直到下一部分数据到达时,它都会通知我相同的数据,对吗?