0
UDP 패킷을 수신하기 위해 UDP 소켓을 여는 중입니다. 그러나 때로는 결코 포인트 Do stuff with data
에 도착하지 않습니다.C# 소켓 BeginRecieve 비동기 콜백이 호출되지 않음
을하지만 콜백 단지 내가 연결 해제 코드를 실행하면 소켓을 닫 실행 : 데이터가 수신되는
, 나는 와이어 샤크에서 볼 수 있습니다.
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);
}
이 내가 갇혀 남아있어 발생 응용 프로그램을 다시 시작하는 것은 도움이되지 않습니다. 콜백이 다시 작동하기 위해 내 컴퓨터를 재부팅해야합니다.
여기에서 어디로 가야할지 또는 어떻게 해결할 것인지 잘 모릅니다.
어떤 아이디어가 발생하고 있습니까?
ObjectDisposedException을 얻으면 그 소켓을 다시 듣기 시작할 수 없습니까? 나는 당신이 "데이터로 물건을"우회 할 필요가 있다고 생각하지만 여전히 다른 BeginReceive를합니까? – andrew
@andrew, 그 시점에서 소켓은 폐기되었고'OpenUDPSocket()'이 사용자에 의해 다시 호출됩니다. –
SocketException이'data.Socket.EndReceive (ar);'에 던져지면 어떻게됩니까? 당신이 처리하지 않는 것 같다 –