2013-07-15 2 views
0

UDP 패킷을 수신하기 위해 UDP 소켓을 여는 중입니다. 그러나 때로는 결코 포인트 Do stuff with data에 도착하지 않습니다.C# 소켓 BeginRecieve 비동기 콜백이 호출되지 않음

wireshark capture

을하지만 콜백 단지 내가 연결 해제 코드를 실행하면 소켓을 닫 실행 : 데이터가 수신되는

, 나는 와이어 샤크에서 볼 수 있습니다.

private void OpenUDPSocket() 
    { 
     this.processDataSockets.Clear(); 
     IPHostEntry host; 
     host = Dns.GetHostEntry(Dns.GetHostName()); 
     foreach (IPAddress ip in host.AddressList) 
     { 
      UPDData data = new UPDData(); 
      data.Socket = new Socket(ip.AddressFamily, SocketType.Dgram, ProtocolType.Udp); 
      data.Socket.Bind(new IPEndPoint(ip, 2222)); 
      data.Socket.EnableBroadcast = true; 
      data.Buffer = new byte[512]; 
      data.Socket.BeginReceive(data.Buffer, 0, 512, SocketFlags.None, this.ReceivedData, data); 
      this.processDataSockets.Add(data); 
     } 

     this.socketOpen = true; 
    } 


    private void ReceivedData(IAsyncResult ar) 
    { 
     UPDData data; 
     try 
     { 
      data = (UPDData)ar.AsyncState; 
      data.Socket.EndReceive(ar); 
     } 
     catch (ObjectDisposedException) 
     { 
      // The connection has been closed 
      return; 
     } 

//... Do stuff with data 

     data.Socket.BeginReceive(data.Buffer, 0, 512, SocketFlags.None, this.ReceivedData, data); 
    } 

이 내가 갇혀 남아있어 발생 응용 프로그램을 다시 시작하는 것은 도움이되지 않습니다. 콜백이 다시 작동하기 위해 내 컴퓨터를 재부팅해야합니다.

여기에서 어디로 가야할지 또는 어떻게 해결할 것인지 잘 모릅니다.

어떤 아이디어가 발생하고 있습니까?

+0

ObjectDisposedException을 얻으면 그 소켓을 다시 듣기 시작할 수 없습니까? 나는 당신이 "데이터로 물건을"우회 할 필요가 있다고 생각하지만 여전히 다른 BeginReceive를합니까? – andrew

+0

@andrew, 그 시점에서 소켓은 폐기되었고'OpenUDPSocket()'이 사용자에 의해 다시 호출됩니다. –

+0

SocketException이'data.Socket.EndReceive (ar);'에 던져지면 어떻게됩니까? 당신이 처리하지 않는 것 같다 –

답변

0

결국이 문제를 해결할 수 없습니다. 비동기 IO 또는 완료 포트에만 국한되지 않았습니다. 마지막으로 PcapDotNet을 사용하여 패킷을 직접 픽업하는 작업을 수행했습니다.

관련 문제