gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 02:50:18 25 4
gpt4 key购买 nike

我正在使用 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/

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