首页 文章

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

提问于
浏览
1

我正在使用 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调用将永久阻止 .

1 回答

  • 1

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

相关问题