c# - 有没有办法让 UDP .net 套接字在套接字关闭时释放绑定(bind)端口?

标签 c# windows sockets windows-7 udp

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

我真正想知道的是

  1. 有没有办法解绑/释放已经绑定(bind)的端口?
  2. 当我设置 socketoption 重用地址时,我能够绑定(bind)到该端口,但我从未使用该地址/端口接收数据?

我正在使用 netstat -apd udp 查看绑定(bind)了哪些端口

我使用的测试代码如下,一般情况下我收到一个数据包后不会关闭端口。

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() 的错误返回,确保它被调用并且返回成功。

关于c# - 有没有办法让 UDP .net 套接字在套接字关闭时释放绑定(bind)端口?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9448764/

相关文章:

java - 加载本地保存在 Xamarin 中的图像?

angularjs - 如何修复找不到模块 Graceful-fs 错误?

C++ Socket recv 未接收到正确的字节数?

c# - 如何在 NHibernate 中映射 Collection<T>?

c# - 如何在使用 asp.net 创建的 Javascript 中查找动态控件

c# - 访问基于变量的预格式化字符串

windows - Mongodb Windows 安装程序 "admin web console waiting for connections on port 28017"错误

c++ - Clang C++ 交叉编译器 - 从 Mac OS X 生成 Windows 可执行文件

java - 多个客户端连接服务器java

javascript - 解决错误时对socket.write的 promise (nodejs)