2012-02-25 86 views
2

對於這個問題,我運行Windows 7 64位,.NET Framework 3.5的有沒有辦法讓UDP .net套接字在套接字關閉時釋放綁定端口?

我真正想知道的是

  1. 是否有辦法解除綁定/釋放已綁定端口?
  2. 當我設置了socketoption重用地址時,我能夠綁定到端口,但我從不接收使用該地址/端口的數據?

我期待在使用綁定哪些端口的netstat -apd UDP

我正在使用的測試代碼的下方,通常接收到一個數據包後,我就不會關閉端口。

EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port); 
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram,ProtocolType.Udp); 
socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);      
socket.Bind(endpoint); 


ReadStateObject stateObject = new ReadStateObject(); 
stateObject.socket = socket; 
stateObject.Port = state.Port; 
stateObject.IPAddress = state.IPAddress; 
stateObject.BurstDataReceivedEvent = state.BurstDataReceivedEvent; 
stateObject.shutdownRequested = state.StopRequestedEvent; 
socket.BeginReceiveFrom(stateObject.buffer, 
         0, 
         stateObject.buffer.Length, 
         SocketFlags.None, // Was 0 which is likely the same enumeration but this is clearer 
         ref endpoint, 
         new AsyncCallback(BurstUdpListener.SocketBeginReceiveAsyncCallback), 
         stateObject); 

// wait for read to complete... or the thread to be asked to stop 
while (stateObject.readFinished.WaitOne(100, false) == false) 
{ 
    // has this thread been requested to stop? if so, cancel the pending read 
    if (state.StopRequestedEvent.WaitOne(1, false) == true) 
    { 
     stop = true; 
     break; 
    } 
} 

socket.Shutdown(SocketShutdown.Both); 
socket.Close(); 
socket = null; 



    private static void SocketBeginReceiveAsyncCallback(IAsyncResult ar) 
    { 

      if (ar.IsCompleted) 
      { 
       ReadStateObject state = ar.AsyncState as ReadStateObject; 
       if (state != null) 
       { 
        if (state.shutdownRequested.WaitOne(1, false)) 
         return; 
        EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port); 
        int bytesReceived = state.socket.EndReceiveFrom(ar, ref endpoint); // for some reason throws error here on changes to settings 
        if (state.BurstDataReceivedEvent != null) 
        { 
         state.BurstDataReceivedEvent(null, new BurstDataReceivedEventArgs(state.buffer, bytesReceived)); 
        } 
        state.readFinished.Set(); 
       } 

     }    

} 
+3

UDP是無連接協議。這個問題沒有意義。 – 2012-02-25 22:43:28

+1

當netstat顯示我時關閉套接字時,端口仍然綁定。當我嘗試重新綁定時,除非我重用地址套接字選項集,否則我會進入使用異常狀態。這就說得通了。如果我重複使用地址套接字選項集,在關閉並打開/綁定端口後,我從不接收數據包。 – SeanV 2012-02-26 15:34:46

+1

編輯該問題以擺脫連接,因爲UDP是無連接協議是正確的。我真正想知道的是1)是否有解綁定/釋放綁定端口的方法。 2)當我設置socketoption重用地址時,我能夠綁定到端口,但我從不接收使用該地址/端口的數據。 – SeanV 2012-02-26 15:40:30

回答

1

close()被稱爲端口應該被釋放,所以,它聽起來就像要麼close()不會被調用或者沒有成功。

刪除shutdown()調用,因爲這不適用於UDP。

檢查close()的錯誤返回以確保它被調用並且它正在返回成功。

+1

感謝您的回答。 close()沒有返回類型? http://msdn.microsoft.com/en-us/library/wahsac9k%28v=vs.90%29.aspx – SeanV 2012-02-27 22:48:31

+0

在方法情況下,如果底層'closesocket()'函數返回錯誤,它應該會引發異常。所以只要確保你實際上達到了這個聲明並捕獲任何異常。 – 2012-02-27 22:57:04

+0

謝謝你的迴應。我可以遍歷代碼,看到他打電話給socket.close()被擊中並返回而沒有拋出異常。 – SeanV 2012-02-28 16:27:47