传入消息是否在.NET UdpClient / UDPServer中自动截断?

时间:2014-09-01 06:19:46

标签: .net vb.net udpclient

在VB6中工作时,我使用Winsock通过互联网发送和接收消息。 VB6 Winsock中的流行问题是,当我发送大约7000个字符的大字符串时,客户端收到许多部分截断为2500-> 3000字符,我需要加入截断的数据包以获得原始消息:

Public FullMessage as string
Private Sub wskConnect_DataArrival(ByVal bytesTotal As Long)
    Dim sBuff As String
    wskConnect.GetData sBuff, vbString
    FullMessage = FullMessage & sBuff
End sub

此链接(VB6 Asynchronous Tcp Client truncates incoming messages

中的VB6 winsock已确认此问题

现在我要将我的代码迁移到.NET Framework。使用.Net UDPClient / TCPClient时,是否需要执行相同的方法? .Net会自动为我解决这个问题,或者邮件仍然是自动截断的,我需要自己加入吗?这个问题是针对UDP协议和TCP协议还是仅针对TCP协议?

2 个答案:

答案 0 :(得分:2)

  

现在我要将我的代码迁移到.NET Framework。使用.Net UDPClient / TCPClient时,是否需要执行相同的方法? .Net会自动为我解决这个问题,或者邮件仍然是自动截断的,我需要自己加入吗? UDP协议和TCP协议是出现此问题还是仅针对TCP协议?

TCP是基于流的协议。在其中没有消息的表示法(如在应用程序级别消息中)。它将所有内容都视为数据字节。

另一方面,UDP确实保证您发送的内容就是您将收到的内容。

但是,还有另一个主要区别。 TCP保证它会最好地传递您的消息(或尝试死亡)。 UDP不保证。它只是承诺,如果它能传递你的信息,那就完整了。但是这个信息也会丢失。

因此,如果您使用TCP,您将获得数据,但您必须自己组装消息。如果您使用UDP,您将按照发送方式获取消息。但消息也可能丢失。

使用TCP编写消息要比在UDP之上编写可靠的协议容易得多。

答案 1 :(得分:1)

没有消息截断,从来没有。您链接上投票最高的答案甚至是这样说的。这就是套接字的工作方式。他们对消息一无所知。他们知道字节正在进入。处理消息是你的工作。

.NET套接字在其他语言中像套接字一样工作,因为这是它们的定义方式。但是,如果您希望交换消息并且不关心套接字的低级别工作,则可以使用WCF之类的机制让.NET Framework执行繁重的工作,并且只交付完成给你的消息。这意味着您必须控制消息对.NET Framework的看法。例如,对于WCF,这可能是SOAP规范,甚至可能是REST