2009-11-03 57 views
1

我在運行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隱藏所有這些差異?

+0

所有機器上的.NET版本相同嗎? – Niklas 2009-11-03 12:26:55

+0

你有沒有檢查過,以確保你所有的.Net版本都是一樣的? – Samuel 2009-11-03 12:27:39

+0

他們似乎都有.net 3.5 sp1 – Tim 2009-11-03 12:32:43

回答

2

是否有可能線程調用BeginReceive終止在某個點?這適用於Vista,但不適用於XP;看到這個related question和接受的答案的意見。

+0

是的,線程終止。該發現工具不會爲BeginReceive使用線程,所以這一定是問題! – Tim 2009-11-03 15:21:23