c#应用程序在UDPClient.Receive上不接收数据包

本文关键字:数据包 Receive 应用程序 UDPClient | 更新日期: 2023-09-27 18:10:05

我遇到了一个奇怪的问题,我似乎无法调试。我的应用程序从通过特定端口发送UDP数据包的设备接收数据包。设置UDP监听器后,定时触发一个while循环,

我应该在每个给定的时间间隔接收400个值,我甚至设置了一个进程来确保这些值通过。下面是相关代码片段:

public UdpClient listener;
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); 
//where listenPort is an int holding the port values should be received from
listener.ExclusiveAddressUse = false;
listener.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
listener.Client.Bind(groupEP);
if (listener.Client.Connected)
{
     listener.Connect(groupEP);
}
//I've actually never seen the app actually enter the code contained above
try
{
    while (!done)
    {
        if (isListenerClosed == false && currentDevice.isConnected)
        {
             try
             {
                  receive_byte_array = listener.Receive(ref groupEP); 
             }
             catch (Exception ex)
             {
                  throw ex;
             }
        }
    }
}
catch (SocketException ex)
{
    throw ex;
}

奇怪的是,这个应用程序在我的PC上运行得很好(通过安装文件/Installshield和在Visual Studio中运行),但在同事的计算机上运行安装文件时却不会收到任何数据(在他的Visual Studio环境中运行得很好)。我还尝试将Visual Studio附加到应用程序的过程中,在那里我发现代码运行良好,直到它达到listener.Receive。在VS中不会捕获异常,也不会给出错误,但代码只是因为没有接收到数据而停止。

顺便说一下,两台机器是相同的(Mac mini运行64位Windows 7 Ultimate N)。

我甚至在主程序中包含了UnhandledExceptionHandler,如下所示:

AppDomain.CurrentDomain.UnhandledException += new UnhandledExceptionEventHandler(CurrentDomain_UnhandledException);
private static void CurrentDomain_UnhandledException(object sender, UnhandledExceptionEventArgs e)
{
    MessageBox.Show("Unhandled Exception Caught " + e.ToString());
    throw new NotImplementedException();
}

这可能是Windows中应用程序权限的问题吗?有什么最好的方法来确定这个问题吗?

c#应用程序在UDPClient.Receive上不接收数据包

UDP是一种无连接协议。不要Connect。相反,您只是在传递数据包。此外,当你使用UdpClient时,不要挖到底层插座。没有意义。

最简单(也很愚蠢)的UDP监听器看起来像这样:

var listener = new UdpClient(54323, AddressFamily.InterNetwork);
var ep = default(IPEndPoint);
while (!done)
{
    var data = listener.Receive(ref ep);
    // Process the data
}

围绕ExclusiveAddressUse(和SocketOptionName.ReuseAddress)做所有的事情只会对你隐藏问题。除非您使用广播或多播,否则该端口上只有一个UDP侦听器会收到消息。这通常是件坏事。

如果这个简单的代码不起作用,请检查管道。防火墙、IP地址、驱动程序等等。安装WireShark并检查UDP数据包是否确实通过-这可能是设备的故障,也可能是错误的配置。

此外,理想情况下,您希望异步执行所有这些操作。如果您使用的是。net 4.5,这实际上非常简单。

如果您在Windows Vista或超越上运行此程序,则可能是UAC。它可以悄悄地阻止插座正常工作。如果您将UAC级别调低,它不仅会阻塞套接字。