如果客户端发送数据并调用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之前使用了数据.

C++相关问答推荐

try 使用sigqueue函数将指向 struct 体的指针数据传递到信号处理程序,使用siginfo_t struct 体从一个进程传递到另一个进程

设计处理各种数据类型的方法和数据 struct

为什么已经设置的值在C中被重置为for循环条件中的新值?

难以理解Makefile隐含规则

为什么C语言允许你使用var =(struct NAME){

有没有可能我不能打印?(C,流程)

我可以在C中声明不同长度数组的数组而不带变量名吗?

为什么cudaFree不需要数据 struct 的地址?

Sizeof(&Q;字符串&Q;)的正确输出是什么?

在Apple Silicon上编译x86的Fortran/C程序

如何在STM8项目中导入STM8S/A标准外设库(ST VisualDeveloper)?

#定义SSL_CONNECTION_NO_CONST

Boyer Moore算法的简单版本中的未定义行为

从C文件中删除注释

这个空指针类型的转换是有效代码还是恶意代码?

静态初始化顺序失败是否适用于C语言?

在C中使用无符号整数模拟有符号整数

根据输入/输出将 C 编译过程分为预处理、编译、汇编和链接步骤

C语言程序流程解释

用于内存布局的size命令(文本、数据、bss)