2010-07-14 81 views
3

我有System.Net.Sockets.Socket的異步Receive方法的嚴重問題。C#:AsyncCallback沒有在Socket.BeginReceive上調用

這裏是我用來打開連接的代碼:

_socket = new Socket(endpoint.AddressFamily, SocketType.Stream, ProtocolType.Tcp); 
_socket.Connect(endpoint); 

byte[] buffer = new byte[1024]; 
_socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, buffer); 

,這裏是回調方法:

private void ReceiveCallback(IAsyncResult result) 
{ 
    byte[] buffer = (byte[])result.AsyncState; 
    int count = _socket.EndReceive(result); 

    if (count > 0) 
    { 
      // Do something 
    } 

    buffer = new byte[1024]; 
    _socket.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, ReceiveCallback, buffer); 
} 

的問題是,ReceiveCallback永遠不會被調用,儘管插座正在連接。

任何人都可以幫我解決這個問題嗎?

+1

你確定有數據被髮送到套接字嗎?在接收數據之前不會調用回調方法。 ('count'永遠不會是'0')。 – dtb 2010-07-14 10:01:47

+0

好吧,如果發送數據,回調被調用,msdn文檔有點誤導性說明:「EndReceive方法會阻塞,直到數據可用」這是真的,但如果未調用回調,則EndReceive不是:/。那我該如何檢測連接的中斷? – haze4real 2010-07-14 10:20:33

+0

如果在數據可用之前調用EndReceive,則EndReceive會阻塞,直到數據可用。但是,由於只有數據可用時纔會調用回調,因此在數據可用之前,您絕不會調用EndReceive。您只能通過*發送*數據來檢測到連接中斷(如果連接中斷,將會失敗)。 – dtb 2010-07-14 10:28:54

回答

3

首先,如果EndRecieve返回0字節,不要忽略。這意味着連接已被遠程端點關閉。

是否確定遠程終端向您發送了某些內容?我敢打賭,情況並非如此。

我已經做了很多套接字應用程序,並且我有從來沒有沒有被調用的回調有任何問題。

處理回調方法中的異常也很重要。如果不這樣做,則會導致應用程序在拋出異常時崩潰。

+0

我的問題中的代碼只是重現問題的示例代碼,我總是處理回調內部的異常以及處理CompletedSynchronously。感謝有關0字節的解釋:) – haze4real 2013-01-23 15:23:11

相關問題