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

C# C应用程序未在UDPClient.Receive上接收数据包,c#,winforms,udpclient,C#,Winforms,Udpclient,我遇到了一个奇怪的问题,我似乎无法调试。我的应用程序从通过特定端口发送UDP数据包的设备接收数据包。设置UDP侦听器后,while循环会定期触发Receive命令 我应该在每个给定的时间间隔收到400个值,我甚至设置了一个过程来确保这些值通过。以下是相关代码的片段: public UdpClient listener; IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort); //where listenPort is a

我遇到了一个奇怪的问题,我似乎无法调试。我的应用程序从通过特定端口发送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中没有给出错误,但代码只是停止,因为没有收到数据

顺便说一句,这两台机器都是相同的MacMini,运行64位Windows7Ultimate N

我甚至在主程序中包含了一个未处理的ExceptionHandler,如下所示:

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中的应用程序权限问题吗?关于找出问题的最佳方法有什么想法吗?

如果您在Windows Vista或更高版本上运行此功能,可能是UAC。它可以悄悄地阻止插座正常工作。如果您降低UAC级别,它不仅会阻塞套接字。

如果您在Windows Vista或更高版本上运行此功能,则可能是UAC。它可以悄悄地阻止插座正常工作。如果您降低UAC级别,它不仅会阻塞套接字。

UDP是一种无连接协议。不要连接。相反,您只是传递数据包。另外,在使用UdpClient时,不要深入底层套接字。没有意义

最简单、最愚蠢的UDP侦听器如下所示:

var listener = new UdpClient(54323, AddressFamily.InterNetwork);

var ep = default(IPEndPoint);

while (!done)
{
    var data = listener.Receive(ref ep);

    // Process the data
}
做所有关于ExclusiveReadDressUse和SocketOptionName.ReuseAddress的事情只会对你隐瞒问题。除非您使用广播或多播,否则该端口上只有一个UDP侦听器将获得消息。这通常是件坏事

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


此外,理想情况下,您希望以异步方式执行所有这些操作。如果您有.NET 4.5,这实际上非常简单。

UDP是一种无连接协议。不要连接。相反,您只是传递数据包。另外,在使用UdpClient时,不要深入底层套接字。没有意义

最简单、最愚蠢的UDP侦听器如下所示:

var listener = new UdpClient(54323, AddressFamily.InterNetwork);

var ep = default(IPEndPoint);

while (!done)
{
    var data = listener.Receive(ref ep);

    // Process the data
}
做所有关于ExclusiveReadDressUse和SocketOptionName.ReuseAddress的事情只会对你隐瞒问题。除非您使用广播或多播,否则该端口上只有一个UDP侦听器将获得消息。这通常是件坏事

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


此外,理想情况下,您希望以异步方式执行所有这些操作。如果你有.NET 4.5,这其实很简单。

可能是防火墙问题,你检查过了吗?防火墙实际上似乎阻止了UDP连接,但没有阻止到internet的连接。因为忽视它而感到愚蠢。谢谢@oleksii!可能是防火墙问题,你检查过了吗?防火墙实际上似乎一直在阻止UDP连接,但没有阻止到internet的连接。因为忽视它而感到愚蠢。谢谢@oleksii!事实证明,防火墙才是问题所在。我已经加入了独家使用,因为我在创建一个新的侦听器时不断收到socketExceptions,这是一个基于会话的应用程序。通过这种方式连接并随后关闭连接似乎解决了我在结束一个会话并开始另一个会话时遇到的问题。我们之前的设备确实有问题。由于一个有故障的组件,我收到的数据包比预期的要少,但从那以后我已经仔细检查过了,一切都很好。我想知道是否有任何方法可以让应用程序对防火墙更加可信windows防火墙默认情况下会阻止几乎所有传入的数据,就这么简单。如果您想更改,可以在安装程序中包含防火墙规则更改。所有合适的服务器都是这样做的:当连接到internet时,您创建的是出站连接,TCP是双向的,因此您根本不需要入站连接,这在默认情况下是允许的。这对我来说是正确的答案:不要呼叫Connect,而是发送远程地址和
发送函数中的端口,例如udpClient.Senddgram、dgram.Length、remoteEndPoint;事实证明,防火墙才是问题所在。我已经加入了独家使用,因为我在创建一个新的侦听器时不断收到socketExceptions,这是一个基于会话的应用程序。通过这种方式连接并随后关闭连接似乎解决了我在结束一个会话并开始另一个会话时遇到的问题。我们之前的设备确实有问题。由于一个有故障的组件,我收到的数据包比预期的要少,但从那以后我已经仔细检查过了,一切都很好。我想知道是否有任何方法可以让应用程序对防火墙更加可信windows防火墙默认情况下会阻止几乎所有传入的数据,就这么简单。如果您想更改,可以在安装程序中包含防火墙规则更改。所有合适的服务器都是这样做的:当连接到internet时,您正在创建出站连接,TCP是双向的,因此您根本不需要入站连接,这在默认情况下是允许的。这对我来说是正确的答案:不要调用Connect,而是在send函数中发送远程地址和端口,例如,udpClient.sendGram、dgram.Length、remoteEndPoint;