【问题标题】:UDP Listener XP/Vista/Win7 Differences?UDP Listener XP/Vista/Win7 的区别?
【发布时间】:2009-11-03 12:06:42
【问题描述】:

我在我的桌面上开发了一些运行 Windows 7 的软件,并且该软件看起来运行良好。该软件似乎也适用于我们的 Vista 笔记本电脑。但是,我在让它在 XP 上运行时遇到了一些问题。

该软件从发现工具开始,该工具在端口 46787 上发送 UDP 广播消息,并在同一端口上侦听来自设备的回复。这适用于所有三个操作系统。

选择发现的设备后,发现 UDP cient 将停止。然后在 46788 端口上启动另一个 UDP 客户端来监听来自设备的数据:

            receiverUDP = new UdpClient("255.255.255.255", 46788);
            receiverUDP.EnableBroadcast = true;

            // Start receiving Async UDP packets
            receiverUDP.BeginReceive(new AsyncCallback(ReceiveUDP), receiverUDP);

在 XP 上,这会在调用 EndReceive 时引发 System.Net.Sockets.SocketException,但它在 Vista/Win7 中完美运行,并且我的数据通过流式传输...

System.Net.Sockets.SocketException: The I/O operation has been aborted because of either a thread exit or an application request
   at System.Net.Sockets.Socket.EndReceiveFrom(IAsyncResult asyncResult, EndPoint& endPoint)
   at System.Net.Sockets.UdpClient.EndReceive(IAsyncResult asyncResult, IPEndPoint& remoteEP)
   at Demo.IOPanel.ReceiveUDP(IAsyncResult result) in C:\...\IOPanel.cs:line 262
   at System.Net.LazyAsyncResult.Complete(IntPtr userToken)
   at System.Net.ContextAwareResult.CompleteCallback(Object state)
   at System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
   at System.Net.ContextAwareResult.Complete(IntPtr userToken)
   at System.Net.LazyAsyncResult.ProtectedInvokeCallback(Object result, IntPtr userToken)
   at System.Net.Sockets.BaseOverlappedAsyncResult.CompletionPortCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* nativeOverlapped)
   at System.Threading._IOCompletionCallback.PerformIOCompletionCallback(UInt32 errorCode, UInt32 numBytes, NativeOverlapped* pOVERLAP)

Windows 防火墙已禁用,没有安装其他防火墙。我已经使用 netstat 检查过,没有其他东西在使用该端口。我尝试了 5 个其他随机端口,但仍然无法正常工作。

我知道堆栈是为 Vista 完全重写的,那么有什么变化? .Net 不应该隐藏所有这些差异吗?

【问题讨论】:

  • 所有机器上的 .NET 版本相同?
  • 您是否检查过所有 .Net 版本是否相同?
  • 他们似乎都有.net 3.5 sp1

标签: c# udp


【解决方案1】:

调用BeginReceive 的线程是否可能在某个时候终止?这在 Vista 中有效,但在 XP 中无效;请参阅此 related question 和已接受答案的 cmets。

【讨论】:

  • 是的,线程终止。发现工具没有为 BeginReceive 使用线程,所以这一定是问题所在!
猜你喜欢
  • 1970-01-01
  • 2011-01-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-12-09
  • 2010-11-09
  • 2010-09-26
  • 2010-09-06
相关资源
最近更新 更多