2014-09-01 46 views
1

在VB6中工作时,我使用Winsock通过Internet发送和接收消息。 在VB6的Winsock流行的问题是,当我送一个大的字符串约7000字符,客户端收到许多部分截断为2500-> 3000字,我需要加入截断包有原来的消息是这样的:传入消息是否在.NET UdpClient/UDPServer中自动截断?

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 winsock(VB6 Asynchronous Tcp Client truncates incoming messages

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

回答

2

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

TCP是基于流的协议。在它里面没有消息符号(如在应用程序级消息中)。它将所有发送的数据视为数据字节。

另一方面,UDP承诺您发送的内容即为您将收到的内容。

但是,还有一个主要的区别。 TCP保证它将尽最大努力传递你的信息(或者试图失败)。 UDP不保证这一点。它只是承诺,如果它能传达你的信息,那就完成了。但是这个信息也可能会丢失。

所以如果你使用TCP,你会得到你的数据,但你必须自己组装你的消息。如果你使用UDP,你会以你发送它们的方式得到消息。但是这些信息也可能会丢失。

imho在TCP上组装消息要比在UDP上编写可靠的协议容易得多。

+0

你的答案意味着你可以使用UDP发送*任何消息*。发送大于单个数据包大小的数据将会遇到与任何基于数据流的协议相同的问题,因为您需要自行实施数据流。这比直接使用TCP更加有效。也许你可以在OP决定UDP将结束他所有的消息发送问题之前编辑它。 – nvoigt 2014-09-01 08:25:25

+0

在这种情况下,65k的限制就足够了,因为他声称“我发送了一个大约7000字符的字符串”。但是,我应该像你说的那样指出这一点。 – jgauffin 2014-09-01 08:28:10

+0

非常感谢你们两位男士,我已经测试过自己并找到了答案。我已经知道65k的限制,以及在使用UDP时数据包丢失的可能性。 jgauffin的答案对我来说很好。同时也非常感谢你分享大量有用的信息。 – DucFabulous 2014-09-01 13:26:22

1

没有消息截断,从来没有。你的链接上最高票数的答案甚至可以这样说。这是插座如何工作。他们对消息一无所知。他们知道字节正在进入。处理消息是你的工作。

.NET套接字像其他语言的套接字一样工作,因为这就是它们的定义方式。但是,如果您想要交换消息并且不关心套接字的低级别工作,则可以使用像WCF这样的机制让.NET Framework完成繁重的工作,并仅向您提供完整的消息。这意味着你必须对消息看起来如何控制.NET Framework。例如,对于WCF,那将是SOAP规范或者甚至可能是REST

+0

您可能想澄清一下,您的答案适用于基于流的协议,如TCP,而不适用于UDP等基于消息的协议。 – jgauffin 2014-09-01 07:19:43

+0

@jgauffin你的意思是说,如果我迁移到UDP,所以我不需要像这样加入可用的数据包? – DucFabulous 2014-09-01 07:31:43

+0

@ user4835:阅读我的答案。 – jgauffin 2014-09-01 08:20:11