VB.Net套接字通信,接收异常数据

时间:2011-02-24 10:02:01

标签: .net vb.net sockets networking air

我正尝试通过套接字与PC上的本地AS3 Air应用程序进行通信。 在这种情况下,VB.Net应用程序充当服务器,而Air应用程序是客户端。

.Net应用程序每隔25毫秒向Air应用程序发送数据。我没有发送任何消息终止。 我只是收到Air app上的数据并进行处理。

在调试数据的接收端,我看到一些转换已经合并。

如果我在大多数情况下连续发送"ABCDEF",我会收到"ABCDEF",但在某些情况下,我会收到"ABCDEFABCDEF"

底层TCP网络是否可能正在组合数据,然后将其作为一个数据包发送。 我是否真的需要发送一些消息终止符,例如像"ABCDEF$"那样,然后在接收端分割我的消息?

我是在忙碌吗?

2 个答案:

答案 0 :(得分:1)

来自Socket.Send的文档:

  

也无法保证您发送的数据会立即显示在网络上。为了提高网络效率,底层系统可能会延迟传输,直到收集到大量的传出数据。成功完成Send方法意味着底层系统有空间缓冲数据以进行网络发送。


也无法保证您在接收端也会收到完整的消息 - 这就是套接字的工作原理。我建议添加一个“消息结束”标记,并在接收代码中循环直到收到完整的消息 - 但是你可能会收到一个跨越两条消息的缓冲区,所以当你有一个“消息结束”标记时,你需要保留在该点之后收到的任何数据,以便用于重建下一条消息。

即。想象你有两条消息要接收 - “AAAAAA”和“BBBBBBBB”。您可能会从三次单独的Receive调用中收到以下内容(将$添加为消息标记结束后):

AAAA
AAAA$BB
BBBBBB$

答案 1 :(得分:1)

您可以在套接字上将NoDelay设置为True吗?

  

Nagle算法旨在通过使套接字缓冲小数据包然后在某些情况下在一个数据包中组合并发送它们来减少网络流量。 TCP数据包由40个字节的标头和正在发送的数据组成。当使用TCP发送小数据包时,TCP报头产生的开销可能成为网络流量的重要部分。在负载很重的网络上,由此开销导致的拥塞可能导致丢失的数据报和重传,以及由拥塞引起的过多传播时间。如果连接上的任何先前传输的数据仍然未被确认,则当新的传出数据从用户到达时,Nagle算法禁止发送新的TCP段。

相关问题