C语言 在epoll_wait中处理接收数据和连接关闭信号

pieyvz9o  于 5个月前  发布在  其他
关注(0)|答案(1)|浏览(96)

如果客户端发送数据并调用close(),而服务器使用epoll_wait()时间较长,导致在同一个epoll_wait()内触发了这两个事件(数据到达和连接关闭),那么在这种情况下使用recv()读取数据会有什么影响?
我知道recv()在连接关闭时返回0,在数据到来时返回读取的数字,但在这种情况下它返回什么?

jtw3ybtb

jtw3ybtb1#

recv()在没有数据要接收时返回0。因此,只要有数据可以接收,就不应该返回0。
因此,如果客户端执行send(),然后执行close(),假设send()发送的数据量为非零,则TCP状态将指示在FIN之后发送了一定量的数据。
即使网络发送FIN的顺序不正确,TCP序列号也会表明FIN后面有一定数量的数据,TCP将等待该数据的到达。如果客户端TCP状态机没有看到来自服务器的接收确认,它将拒绝接收。
这些都是TCP提供的流的可靠和有序的数据传输保证。因此,服务器上的recv()调用不会返回0,直到其他recv()调用在FIN之前消耗了数据。

相关问题