使用TCP / IP进行套接字编程:recv()块

时间:2014-06-12 16:01:59

标签: c sockets networking tcp ip

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

服务器设置监听套接字,客户端连接。首先,发送一个短的16字节“报头”,其中包含一些信息,包括之后要发送的数据量。然后传输大块(大约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; }
}

现在,服务器接收前几个块,但是再次阻塞。

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

1 个答案:

答案 0 :(得分:1)

您是否检查了要检查的send的返回码,实际发送了多少字节?发送和recv都不保证发送/接收给定的字节数。他们可以处理更少,你必须再次调用send / recv来处理剩下的事情。

因此,如果您实际发送的字节数少于预期,则说明为什么recv将阻止等待更多数据(未发送)。