C#Socket BeginReceive Asynccallback未被调用

时间:2013-07-15 10:52:58

标签: c# asyncsocket

我正在打开一个用于接收udp数据包的UDP套接字。但有时它永远不会到达Do stuff with data点。

正在接收数据,我可以在Wireshark上看到它:

wireshark capture

但是当我运行Disconnect代码时,回调只会运行以关闭套接字。

    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);
    }

当发生这种情况时,我会卡住,重新启动应用程序无济于事。我需要重新启动我的机器才能重新开始工作。

我不知道从哪里开始或如何解决这个问题。

任何想法发生了什么?

1 个答案:

答案 0 :(得分:0)

最终我们无法解决此问题。它不仅限于异步IO或完成端口。最后,我们采取了使用PcapDotNet直接获取数据包的步骤,这是有效的。