如果客户端发送数据并调用close()
,服务器使用epoll_wait()
很长一段时间后,导致同一个epoll_wait()
内触发这两个事件(数据到达和连接关闭),那么在这种情况下,我使用recv()
读取数据会有什么影响?
我知道recv()
在连接关闭时返回0,在数据到来时返回读取的数字,但在这种情况下它返回什么?
如果客户端发送数据并调用close()
,服务器使用epoll_wait()
很长一段时间后,导致同一个epoll_wait()
内触发这两个事件(数据到达和连接关闭),那么在这种情况下,我使用recv()
读取数据会有什么影响?
我知道recv()
在连接关闭时返回0,在数据到来时返回读取的数字,但在这种情况下它返回什么?
当没有更多数据可接收时,recv()
返回0.因此,只要存在可以接收的数据,它就不应该返回0.
因此,如果客户端先发送send()
,然后再发送close()
,假设send()
正在发送非零量的数据,则TCP状态将指示先发送了一定数量的数据,然后发送FIN
.
即使网络无序地传送FIN
,TCP序列号也将指示FIN
落后于一定数量的数据,并且TCP将等待该数据的到达.如果客户端TCP状态机没有看到来自服务器的接收确认,则它将重新传输.
这些都是由TCP提供的流的可靠和有序的数据传递保证.因此,服务器上的recv()
调用不会返回0,直到其他某个recv()
调用在FIN
之前使用了数据.