我遇到了一个简单的函数(语言为C ++)的问题,该函数遍历对象列表,对其进行序列化并将其发送到远程服务器。我在运行FreeRTOS和LwIP的ESP32板上运行此功能,因此我有一个TCP输出缓冲区,默认情况下限制为5744字节(我可以自定义它,但我不想超过10-15千个字节)
基本上就是这种情况:我在套接字上多次调用(通常200-300次)write()或send(),每次写入约1400个字节。一段时间后,如果另一端的服务器有点慢,我将饱和TCP输出缓冲区。 现在,据我所知,send()或write()应该等待,直到有足够的空间将数据再次写入套接字,但是函数立即返回一个与我要写入的值不同的值(比如说1400字节) )。
char buffer[1460];
result = write(current_socket, buffer, 1460);
if(result != 1460){
// error
} else {
// everything ok
}
该套接字是默认套接字,因此它是阻塞套接字,并且未指定任何选项。我想阻止写操作,直到有足够的空间来写以上代码中指定的所有1460个字节。写操作应返回错误的唯一原因应该是另一端发生故障,例如服务器关闭套接字。这可能吗?
答案 0 :(得分:2)
您看到的被称为部分写入。这对于TCP是正常的。
当缓冲区部分已满时,对write
的调用将复制尽可能多的数据,并返回复制到缓冲区中的字节数。稍后处理其余数据是您的工作。
为了发送数据缓冲区,您需要循环直到缓冲区为空:
buf_ptr = 0;
buf_end = 1460;
while(buf_ptr < buf_end) {
rc = write(fd, buf + buf_ptr, buf_end - buf_ptr);
if(rc <= 0)
break
buf_ptr += rc;
}