2010-07-14 4 views
3

System.Net.Sockets.Socket의 비동기 수신 메서드에 심각한 문제가 있습니다. 여기 C# : Socket.BeginReceive에서 AsyncCallback이 호출되지 않습니다.

내가 연결을 여는 데 사용하는 코드입니다 :

_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

+0

데이터가 콜백되면, msdn 문서는 "EndReceive 메서드가 데이터를 사용할 수있을 때까지 차단됩니다"라고 오해하기 쉽습니다. 콜백이 호출되지 않으면 EndReceive는 다음 중 하나가 아닙니다. 그렇다면 어떻게 연결 중단을 감지 할 수 있습니까? – haze4real

+0

데이터를 사용할 수 있기 전에 EndReceive를 호출하면 EndReceive가 데이터를 사용할 수있을 때까지 차단합니다. 그러나 콜백은 데이터를 사용할 수있을 때만 호출되기 때문에 데이터를 사용할 수 있기 전에는 EndReceive를 호출하지 않습니다. * 데이터 전송만으로 연결에 대한 중단을 감지 할 수 있습니다 (연결이 중단 된 경우 실패합니다). – dtb

답변

3

우선 EndRecieve이 0 바이트를 반환하면 무시하지 마십시오. 연결이 원격 종점에 의해 닫혔다는 의미입니다.

원격 종점에서 내게 뭔가를 보내셨습니까? 내 내기는 사실이 아닙니다.

나는 꽤 많은 소켓 응용 프로그램을 만들었고 도 없었습니다.은 콜백이 호출되지 않는 문제가 없었습니다.

콜백 메소드에서 예외를 처리하는 것도 매우 중요합니다. 그렇게하지 않으면 예외가 발생할 때 응용 프로그램이 중단됩니다.

+0

내 질문에 코드는 문제를 재현하는 샘플 코드, 나는 항상 콜백 내부뿐만 아니라 CompletedSynchronously 처리 예외를 처리합니다. 0 바이트에 대한 설명 주셔서 감사합니다 :) – haze4real

관련 문제