2010-01-03 198 views
1

我想在以下一些信息:C#異步套接字BeginSend

Socket.BeginSend Method (array<Byte>[]()[], Int32, Int32, SocketFlags, AsyncCallback, Object) 

client.BeginSend(message, 0, message.Length, SocketFlags.None, new AsyncCallback(SendData), client); 

如果message.lenght大於緩衝區大小(32)我一定要調用BeginSend多次傳輸整個數據包更大?

或者我只是在另一端做多個讀取,直到收到實際緩衝區長度的結尾?

這是一個討論,即時閱讀實際執行前的文件。

謝謝。

回答

4

緩衝區大小不是32,它正好是定義的message.Length。您可能會將Int32與值32混淆。

在上述情況下,只要實際消息大小小於2147483648(2^31),您可以通過一次調用將該消息發送給該方法。

在接收端可以有幾種選擇:

  1. 如果郵件的大小是不知道,你可以使用一個循環由大塊閱讀塊,直到一個Receive調用返回不到一個完整的塊大小。
  2. 如果消息在前幾個字節(即其頭部)中包含其長度,則可以先讀取頭部,然後分配足夠的緩衝空間以在一次調用中讀取整個消息。
  3. 如果消息大小保證小於某個數字,則可以分配足夠大的緩衝區,以保證在一次調用中讀取任何消息。
+0

即時通訊只是好奇,但爲什麼沒有類似的接收結束?一種方法是一次取得真正的data.length數據包,而不是多次讀取緩衝區長度(32個),以獲得完整的數據?希望我明白原因,我對此感到新奇。謝謝。 – iTEgg 2010-01-03 19:19:37

+0

我將編輯我的答案以解決... – 2010-01-03 19:20:38

+0

謝謝。你一直很有幫助。 – iTEgg 2010-01-03 19:25:39