问题如上,在论坛上查了,好像也没被解决!我也是遇到了这个问题,简单写了一个程序测试,如下,该释放也释放了,该允许重复利用端口也允许了,但是就是没解决!求CSDN高手!        TcpClient client;
        const int portNO = 60000;
        const int localport = 2290;        private void button1_Click(object sender, EventArgs e)
        {
            if (client != null)
            {
                client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.DontLinger, true);
                //client.Close();
                
                
                //socketListen.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);            }
            //else
            //{
                IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
                IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, localport);
                client = new TcpClient(ipLocalEndPoint);
                client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
                client.Connect("127.0.0.1", portNO);
                string msg = "LOGEIN";
                byte[] buffer = System.Text.Encoding.Default.GetBytes(msg);
                int i = client.Client.Send(buffer);
                Console.ReadLine();
            //}
        }        private void button2_Click(object sender, EventArgs e)
        {
            client.Client.Disconnect(true);
            //client.Dispose();
            client.Close();
        }

解决方案 »

  1.   

    应该用GC手动强制把内存回收了,这个要涉及到.net核心机制内存回收,如果要细致观察推荐查看IL!
      

  2.   

    tcp关闭方端口有2分钟等待时间 
      

  3.   

    这个是知道的,但是现在就是不想改端口实现同一端口的重连!我用sockettool建一个服务,建一个客户,自己断开--连接---断开---连接,测试蛮好的。说明socket重连应该没问题哟。C#这个没做好?
      

  4.   

    我这个不是监听哟,我是用SOCKETTOOL建立的服务端,用C#编写的客户端,按一个按钮---连接;按另一个按钮---断开连接,释放资源;以此测试写一个手动重连的客户端程序
      

  5.   

    不是特别要求,建议不要指定local portnumber
      

  6.   

    初始化时候 建立socket  不要释放socket发送的时候检测是否断开  断开重新Connect  然后send
      

  7.   

    初始化socket如果为null,是不会释放的,只是点击了断开按钮后,防止没释放,在加上以下。测试显示好像没用。至于说检测是否断开了连接,然后重连,然后send。我的程序本来只是为了解决如题说的“通常每个套接字地址(协议/网络地址/端口)只允许使用一次”的问题,实际上及时判断connected属性为false,重新以这个端口初始化连接,也是会报这个错的!说以connected这个不是根本!
      

  8.   

    MSDN说:socket的Close 方法可关闭远程主机连接,并释放所有与 Socket 关联的托管资源和非托管资源。
    既然调用close能释放所有资源,不明白为什么还是会报错呢!?~
      

  9.   

    如果你真想又开有关的,shutdown就行了,不要close。如果调用close,那么除非关闭进程,否则不要重用端口。
      

  10.   

    按SP1234说的,我把button1的代码改为如下                try
                    {                        IPAddress ipAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList[0];
                            IPEndPoint ipLocalEndPoint = new IPEndPoint(ipAddress, localport);
                            client = new TcpClient(ipLocalEndPoint);
                            client.Connect("127.0.0.1", portNO);
                        string msg = "LOGEIN";
                        byte[] buffer = System.Text.Encoding.Default.GetBytes(msg);
                        int i = client.Client.Send(buffer);
                        Console.ReadLine();
                    }
                    catch (Exception we)
                    {
                        Console.WriteLine(we.ToString());
                    }button2的代码改为如下: //client.Client.Disconnect(true);            client.Client.Shutdown(SocketShutdown.Both);使用shutdown是可以断开与服务器的连接,但是再次点击button1,重连时仍然会报错!
      

  11.   

    而且有意思的是,如果服务器主动提出断开与客户端的连接,如下
                     Socket socket2 = listener.Accept();
                   socket2.Disconnect(true);
                   Console.WriteLine(socket2.RemoteEndPoint.ToString());
                    socket2.Close();
    服务器这时会阻止在socket2.Disconnect(true);这里在客户端点击button2.也就是调用
     client.Client.Shutdown(SocketShutdown.Both);
    再用button1重连,是可以连上的!而且不报错!
      

  12.   

    是tcp协议决定的,TCPSTATE中的timewait,看了一天的资料,终于搞清楚了!
    看来要么改注册表,要么换端口了!