有没有办法让UDP .net套接字在套接字关闭时释放绑定端口?

有没有办法让UDP .net套接字在套接字关闭时释放绑定端口?

问题描述:

对于这个问题,我运行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

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