2012-05-31 95 views
6

我正在爲我的分佈式系統編寫一個消息層。我正在使用IOCP,即Socket.XXXAsync方法。SocketAsyncEventArgs緩衝區充滿零

(其實,我的接收功能是基於他)我在做什麼這裏的東西很接近: http://vadmyst.blogspot.com/2008/05/sample-code-for-tcp-server-using.html

我現在發現的是,在節目的開始(二測試服務器彼此交談)我每次獲得一些SAEA對象,其中.Buffer完全填充零,但.BytesTransferred是緩衝區的大小(在我的情況下爲1024)。

這是什麼意思?有我需要檢查的特殊情況嗎?我的系統將此解釋爲不完整的消息並繼續前進,但我想知道是否實際上丟失了一些數據。我的印象是,如果沒有收到任何東西,你就不會得到回撥。在任何情況下,我都可以在WireShark中看到沒有任何零長度的數據包進來。

我在谷歌搜索中發現了以下內容,但我不確定我的問題是否相同: http://social.msdn.microsoft.com/Forums/en-US/ncl/thread/40fe397c-b1da-428e-a355-ee5a6b0b4d2c

http://go4answers.webhost4life.com/Example/socketasynceventargs-buffer-not-ready-121918.aspx

+0

我沒有任何數據處理錯誤丟失的數據,所以我覺得沒有任何損失。但是,這仍然留下了爲什麼該方法會幾次返回而沒有任何結果的問題。 – Carlos

+1

如果沒有您的簡要說明(帶有代碼),很難爲您提供解決方案。不過,我有套接字的經驗,我可以推薦使用更高的抽象 - 網絡流。網絡流具有您想要使用的所有異步回調功能。查看http://msdn.microsoft.com/en-us/library/system.net.sockets.networkstream.aspx和http://msdn.microsoft.com/en-us/library/system.net.sockets。 networkstream.beginwrite.aspx HTH –

+0

它是相同的底層調用?這聽起來很有用。此外,我所指的代碼位於鏈接中。 – Carlos

回答

0

我肯定不是在鏈接例子回事。它似乎以同步方式使用異步套接字。我在代碼中看不到任何回調或類似內容。您可能需要重新考慮是否需要同步或異步套接字:)。

由於在網絡發送/接收完成之前您的函數試圖讀取/寫入緩衝區的可能性。嘗試使用異步套接字中包含的回調函數。例如。

// This goes into your accept function, to begin receiving the data 
    socketName.BeginReceive(yourbuffer, 0, yourbuffer.Length, 
     SocketFlags.None, new AsyncCallback(OnRecieveData), socketName); 

// In your callback function you know that the socket has finished receiving data 
// This callback will fire when the receive is complete. 
private void OnRecieveData(IAsyncResult input) { 
    Socket inSocket = (Socket)input.AsyncState; // This is just a typecast 
    inSocket.EndReceive(input); 

    // Pull the data out of the socket as you already have before. 
    // state.Data.Write ...... 
} 
+0

回調是SAEA對象上的事件處理程序。我實際上運行的代碼只有一些最小的語法錯誤。 – Carlos

+0

你有可能將你的接收器代碼粘貼到pastebin或類似的東西,我只看到你基於你的例子。 – themartinmcfly