我有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永遠不會被調用,儘管插座正在連接。
任何人都可以幫我解決這個問題嗎?
你確定有數據被髮送到套接字嗎?在接收數據之前不會調用回調方法。 ('count'永遠不會是'0')。 – dtb 2010-07-14 10:01:47
好吧,如果發送數據,回調被調用,msdn文檔有點誤導性說明:「EndReceive方法會阻塞,直到數據可用」這是真的,但如果未調用回調,則EndReceive不是:/。那我該如何檢測連接的中斷? – haze4real 2010-07-14 10:20:33
如果在數據可用之前調用EndReceive,則EndReceive會阻塞,直到數據可用。但是,由於只有數據可用時纔會調用回調,因此在數據可用之前,您絕不會調用EndReceive。您只能通過*發送*數據來檢測到連接中斷(如果連接中斷,將會失敗)。 – dtb 2010-07-14 10:28:54