2014-09-01 61 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