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

时间:2014-06-23 10:32:47

标签: c# winforms udpclient

我遇到了一个我似乎无法调试的好奇问题。我的应用程序从通过特定端口发送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中应用程序权限的问题吗?有关确定问题的最佳方法的任何想法吗?

2 个答案:

答案 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级别,它就不会阻止套接字。