C#应用程序没有在UDPClient.Receive上接收数据包

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

我应该在每个给定的时间间隔收到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 。 没有exception被捕获,VS中没有给出错误,但代码只是因为没有收到数据而停止。

顺便提一下,两台机器都是相同的(Mac Minis运行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中的应用程序权限问题吗? 有关确定问题的最佳方法的任何想法?

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 。 它可以安静地防止sockets正常工作。 如果你关闭UAC级别,它不会只是阻止套接字。