C - recv 阻塞,直到发送第二个数据包



我正在使用recv方法在Windows CE 6.1系统上通过TCP接收数据。出于某种原因,对 recv 的第一次调用有时会阻塞,直到发送下一个数据包。我现在突然同时收到两个数据包。

tcpClientSocketId = accept( tcpServerSocketId, (struct sockaddr *)&client, (int *)&sockaddrLength );
if( tcpClientSocketId < 0) return;
recvCount = recv( tcpClientSocketId, buffer, TCP_RECV_BUFFERSIZE, 0 );   //blocking until second packet is received

我验证了数据实际上是使用Wireshark发送的。有人知道为什么recv方法会阻止吗?

编辑:澄清一下:我不依赖于逐包接收的数据 - 这些数据被组合成一个字符串并稍后处理。我不知道如何验证数据是否确实在Windows CE系统中接收,除了等待recv调用返回,但我可以看到数据是在客户端使用wireshark发送的,并且一旦发送第二个数据包,两个数据包的数据就会立即收到。如果我不发送第二个数据包,recv 调用将永远阻塞。

使用基于流的套接字时,您无法保证如何处理数据,所有已完成的 recv 调用都会告诉您一定数量的数据到达或远程端已断开其发送端的连接并且所有数据都已到达或存在错误。即使所有数据都作为单个线数据包发送,单个 recv 也可能无法获得全部数据,即使提供的缓冲区足够大。但是,TCP确实保证交货顺序。您需要一些其他方法来确定是否已收到完整的通信(行尾是基于文本的协议通常选择的触发器(。

相关内容

最新更新