【发布时间】: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