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

标签 c tcp windows-ce 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 方法会阻塞吗?

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

最佳答案

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

关于c - recv 阻塞直到发送第二个数据包,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49821660/

相关文章:

serial-port - WinCE与PC USB通讯

c - 从另一个 exe 运行 exe

c - 音频播放,为淡入/淡出创建嵌套循环

c - Linux TCP 连接被拒绝

ios - 嵌入式设备上可通过 iOS 访问的 WebService

c# - 通过命令行在 Windows CE 和 Windows Mobile 设备上导入根证书

c - MASM:从程序集访问全局 C 变量

c - 测试 Paillier 库时出错 : (. text+0x72): undefined reference

Java新套接字连接与保持 Activity

c - 在 TCP/UDP 套接字中绑定(bind)