我遇到了一个我似乎无法调试的好奇问题。我的应用程序从通过特定端口发送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
。没有异常被捕获,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中应用程序权限的问题吗?有关确定问题的最佳方法的任何想法吗?
答案 0 :(得分:4)
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,这实际上非常简单。
答案 1 :(得分:1)
如果您在 Windows Vista或更高版本上运行此功能,则可能是UAC
。它可以安静地防止插座正常工作。如果你关闭UAC
级别,它就不会阻止套接字。