如果客户端发送数据并调用close(),而服务器使用epoll_wait()时间较长,导致在同一个epoll_wait()内触发了这两个事件(数据到达和连接关闭),那么在这种情况下使用recv()读取数据会有什么影响?我知道recv()在连接关闭时返回0,在数据到来时返回读取的数字,但在这种情况下它返回什么?
close()
epoll_wait()
recv()
jtw3ybtb1#
recv()在没有数据要接收时返回0。因此,只要有数据可以接收,就不应该返回0。因此,如果客户端执行send(),然后执行close(),假设send()发送的数据量为非零,则TCP状态将指示在FIN之后发送了一定量的数据。即使网络发送FIN的顺序不正确,TCP序列号也会表明FIN后面有一定数量的数据,TCP将等待该数据的到达。如果客户端TCP状态机没有看到来自服务器的接收确认,它将拒绝接收。这些都是TCP提供的流的可靠和有序的数据传输保证。因此,服务器上的recv()调用不会返回0,直到其他recv()调用在FIN之前消耗了数据。
send()
FIN
1条答案
按热度按时间jtw3ybtb1#
recv()
在没有数据要接收时返回0。因此,只要有数据可以接收,就不应该返回0。因此,如果客户端执行
send()
,然后执行close()
,假设send()
发送的数据量为非零,则TCP状态将指示在FIN
之后发送了一定量的数据。即使网络发送
FIN
的顺序不正确,TCP序列号也会表明FIN
后面有一定数量的数据,TCP将等待该数据的到达。如果客户端TCP状态机没有看到来自服务器的接收确认,它将拒绝接收。这些都是TCP提供的流的可靠和有序的数据传输保证。因此,服务器上的
recv()
调用不会返回0,直到其他recv()
调用在FIN
之前消耗了数据。