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

时间:2018-04-13 16:41:50

标签: c tcp windows-ce recv

我正在使用func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { let meta = chartMetas[indexPath.row] let cell = tableView.dequeueReusableCell(withIdentifier: "chartCell", for: indexPath) as! ChartTableViewCell cell.readings = currentReadings cell.updateCell(lineChartData: arrayOfGeneratedChartData[indexPath.row]) return cell } 方法在Windows CE 6.1系统上通过TCP接收数据。出于某种原因,第一次调用recv有时会阻塞,直到发送下一个数据包。我现在突然立刻得到两个包。

recv

我确认数据实际上是使用Wireshark发送的。有没有人知道为什么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 方法会阻塞?

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

1 个答案:

答案 0 :(得分:1)

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