我在運行Windows 7的桌面上開發了一些軟件,該軟件看起來很完美。該軟件似乎也適用於我們的Vista筆記本電腦。但是,我有一些問題讓它在XP上工作。UDP Listener XP/Vista/Win7差異?
該軟件從一個發現工具開始,該工具在端口46787上發送UDP廣播消息,並偵聽來自該端口上的設備的回覆。這適用於所有三個操作系統。
一旦選定了發現的設備,就會停止發現UDP cient。然後另一個UDP客戶端啓動在端口46788監聽設備數據:
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版本相同嗎? – Niklas 2009-11-03 12:26:55
你有沒有檢查過,以確保你所有的.Net版本都是一樣的? – Samuel 2009-11-03 12:27:39
他們似乎都有.net 3.5 sp1 – Tim 2009-11-03 12:32:43