日期:2014-05-18  浏览次数:21059 次

没高手解决?SP1234?通常每个套接字地址(协议/网络地址/端口)只允许使用一次
问题如上,在论坛上查了,好像也没被解决!我也是遇到了这个问题,简单写了一个程序测试,如下,该释放也释放了,该允许重复利用端口也允许了,但是就是没解决!求CSDN高手!
C# code

        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();
        }



------解决方案--------------------
应该用GC手动强制把内存回收了,这个要涉及到.net核心机制内存回收,如果要细致观察推荐查看IL!
------解决方案--------------------
tcp关闭方端口有2分钟等待时间 


------解决方案--------------------
纯发送数据 可以使用端口0 也就是 由系统指派随意未使用的端口
------解决方案--------------------
不是特别要求,建议不要指定local portnumber
------解决方案--------------------
如果你真想又开有关的,shutdown就行了,不要close。如果调用close,那么除非关闭进程,否则不要重用端口。
------解决方案--------------------
哪方提出断开 哪方等待2分钟 除非你修改你的注册表 缩小这个值

但是如果你的软件开发完成要分发给别人使用 这种方法是不可取的