c# - UDP有时收不到东西

标签 c# sockets udp

我有一个从远程主机接收 UDP 数据的 C# 应用程序。我发现有时我的套接字没有收到任何东西,而且我似乎找不到任何线索来解释为什么! Wireshark 告诉我我的数据正在从远程设备正确发送。我似乎不明白为什么有时我可以收到罚款,有时我不能。

我没有得到任何异常,但是 OnRecieve 永远不会被调用

这是我的代码以防有帮助:

class cUdpRx
{
    private Thread rxThread = null;
    private Socket UdpSocket;
    private IPEndPoint localEp;
    byte[] byData;
    //rxbytes event
    public delegate void OnRxBytesEventHandler(byte[] rxBuf);
    public event OnRxBytesEventHandler OnRxBytesEvent;



    /// <summary>
    /// Creates the udp socket
    /// </summary>
    /// <param name="Port"></param>
    /// <returns></returns>
    public bool CreateSocket(int Port)
    {
        try
        {
            byData = new byte[1500]; //create our buffer
            UdpSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
            UdpSocket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
            localEp = new IPEndPoint(IPAddress.Any,Port);
            UdpSocket.Bind(localEp);
            UdpSocket.BeginReceive(byData,0,byData.Length, SocketFlags.None, new AsyncCallback(OnRecieve), UdpSocket);

            return true;    //seemed to work ok
        }
        catch
        {
            Dispose();
            return false;   //something went wrong, abort
        }
    }

    private void OnRecieve(IAsyncResult iar)
    {
        byte[] rxData;
        int nBytesRec = 0;
        Socket socket = (Socket)iar.AsyncState;
        try //in case something else has already disposed of the socket
        {
            nBytesRec = socket.EndReceive(iar);
        }
        catch
        {
            Debug.WriteLine("cant access udp rx socket");
        }
        try
        {
            if (nBytesRec > 0)
            {
                rxData = new byte[nBytesRec];
                Array.Copy(byData, rxData, nBytesRec); //copy exact data into new array
                OnRxBytesEvent(rxData);
            }
            if(!killThreads)
                UdpSocket.BeginReceive(byData, 0, byData.Length, SocketFlags.None, new AsyncCallback(OnRecieve), UdpSocket);
        }
        catch(SocketException se)
        {
            Debug.WriteLine(se.ToString());
        }
    }

任何帮助都将非常感激,因为它会阻止我继续我的项目。谢谢

更新 似乎使用 IPAdress.any 是问题所在。如果我改变:

localEp = new IPEndPoint(IPAddress.Any,Port);

localEp = new IPEndPoint(IPAddress.Parse("192.168.0.33"),Port);

其中192.168.0.33是我电脑的IP地址,每次都会收到数据。 谁能解释为什么? 使用 IPAddress.any 并从无线和有线连接接收信息非常有用。 IPAddress.any 相当于 0.0.0.0,根据 MSDN,它应该在所有网络接口(interface)上接收。

最佳答案

此类问题的常见原因是处理数据包的速度不够快。它们填满套接字接收缓冲区,内核开始丢弃它们。

增加 socket receive buffer size以适应流量突发。 从快速套接字读取路径中删除所有非必要的内容。 考虑下面的简单迭代方法而不是针对线程池工作:

rxData = new byte[nBytesRec];

while ( !time_to_stop ) {
    int len = socket.Receive( rxData );
    OnRxBytesEvent( rxData, len );
}

您的代码注释提到了多播。请注意,您需要添加显式 group membership为此,以及您在接口(interface)上加入多播组这一事实(显式或通过路由表决定),因此如果您想在两个接口(interface)上监听多播数据,则需要两个套接字。

关于c# - UDP有时收不到东西,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11792351/

相关文章:

c# - C# 是否存储对来自 TPL 的任务的引用

python - SWIG 从 c 中调用 python 代码

ios - Swift:TCP套接字保持事件状态

swift - 绑定(bind)到 macOS 10.12 上的套接字时的 NSPOSIXErrorDomain

C++ 奇怪的 RAW 套接字和 iptables 问题

java - DatagramSocket - 绑定(bind)本地主机套接字

c# - 什么是 AsyncWCF` 中的 AsyncCallback 和 AsyncState?

c# - 一个对象从它所在的列表中删除自己的潜在危险是什么?

Java Sockets - 接收空白缓冲区

c# - WPF 从底部到顶部调整窗口大小