gpt4 book ai didi

c - 使用 TCP/IP : recv() blocks 的套接字编程

转载 作者:可可西里 更新时间:2023-11-01 02:52:00 26 4
gpt4 key购买 nike

我正在开发一个简单的客户端/服务器项目,它将一大块数据从客户端移动到服务器。我使用 TCP/IP。

服务器设置监听套接字,客户端连接。首先传输一个短的 16 字节“ header ”,其中包含一些信息,包括之后要传输的数据量。然后传输大块(大约2MB),即

send( socketDesc, (void *) myBuffer, bigChunkSize, 0 );

recv( socketDescPeer, (void *) myBuffer, bigChunkSize, 0 )

首先,我使用 winsock2 在 Windows 下实现了客户端,它可以正常工作。我现在尝试将此实现移植到 linux,在这种情况下,服务器端永远不会从 recv() 调用返回(但是“ header ”被正确传输)。然后我尝试像这样以较小的固定大小块发送数据

unsigned int byteSent = 0;
while( byteSent < bigChunkSize ) {
int result = send( socketDesc, (void *) myBuffer, smallChunkSize, 0 );
if ( result < 0 ) {...} else { byteSent += result; }
}

现在,服务器接收前几个 block ,但随后再次接收 block 。

有什么想法吗?请记住,使用 winsock2 传输没有问题!非常感谢!

最佳答案

你有没有检查发送的返回码来检查,真正发送了多少字节? send 和 recv 都不能保证发送/接收给定的字节数。他们可以处理更少,你必须再次调用 send/recv 来处理剩下的。

因此,如果您实际发送的字节数少于预期,它会解释为什么 recv 会阻塞等待更多数据(未发送)。

关于c - 使用 TCP/IP : recv() blocks 的套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24188938/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com