Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/325.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 有没有办法让UDP.net套接字在套接字关闭时释放绑定端口?_C#_Windows_Sockets_Windows 7_Udp - Fatal编程技术网

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

C# 有没有办法让UDP.net套接字在套接字关闭时释放绑定端口?,c#,windows,sockets,windows-7,udp,C#,Windows,Sockets,Windows 7,Udp,对于这个问题,我正在运行windows 7 64位.net framework 3.5 我真正想知道的是 是否有方法解除绑定/释放已绑定的端口 当我设置socketoption重用地址时,我可以绑定到端口,但我从未使用该地址/端口接收数据 我正在研究使用netstat-apd-udp绑定哪些端口 我正在使用的测试代码如下,通常我不会在收到一个数据包后关闭端口 EndPoint endpoint = new IPEndPoint(state.IPAddress, state.Port); Sock

对于这个问题,我正在运行windows 7 64位.net framework 3.5

我真正想知道的是

  • 是否有方法解除绑定/释放已绑定的端口
  • 当我设置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();
                    }
    
             }            
    
     }
    

    调用
    close()
    时应释放端口,因此听起来好像没有调用
    close()
    或者调用失败

    删除
    shutdown()
    调用,因为该调用实际上不适用于UDP


    检查
    close()
    的错误返回,以确保调用它并且返回成功。

    UDP是无连接协议。这个问题毫无意义。当我关闭套接字时,端口仍然被绑定,正如netstat所示。当我尝试重新绑定时,我将进入使用中异常,除非我设置了重用地址套接字选项。这是有道理的。如果我设置了重用地址套接字选项,则在关闭和打开/绑定到端口后,我从未收到数据包。编辑此问题以摆脱连接,因为您正确地认为UDP是无连接协议。我真正想知道的是1)是否有方法解除绑定/释放已绑定的端口。2) 当我设置socketoption重用地址时,我可以绑定到端口,但我从未使用该地址/端口接收数据。谢谢您的回答。close()没有返回类型吗?在方法案例中,如果底层的
    closesocket()
    函数返回错误,它应该抛出异常。因此,请确保您确实达到了该语句并捕获了任何异常。谢谢您的回复。我可以一步一步地浏览代码,看到他对socket.close()的调用被命中并返回,而不会抛出异常。但是在
    close()
    之后,
    netstat-a-u-p-n
    仍然显示端口号绑定到该进程?我想你的意思是-b而不是-u,但答案是肯定的。