创建一个tcp模式的Socket,Connect后Disconnect。
这时候如果立即再Connect会报“通常每个套接字地址(协议/网络地址/端口)只允许使用一次。”异常。
如果等上10多秒之后再connect,就能成功连接。
这是为什么?有没有什么办法能够立即连接就可以成功?
试过断开后新创建一个socket连接相同的ip和端口可以立即连上。不创建新Socket有没有办法解决?

解决方案 »

  1.   

    你应该先把这个链接关闭了,close()一下
      

  2.   

    为什么要close呢 close后这个socket还能再用么?我的意图是不创建新的socket,只用一个socket实例。
      

  3.   

    disconnect 不应该也算 断开连接么?
      

  4.   

    看MSDN帮助文档,Disconnect()后,并不一定会释放完所有的资源
    1.Socket.ShutDown();
    Socket.Disconnect(true)2.Socket.Disconnect(true)
      

  5.   

    setsockopt()函数里有可以设置reuse的参数。
      

  6.   

    Socket.Disconnect(true) reuseSocket参数给的是true,不然过10多秒也不会成功的。
      

  7.   

    经过试验
    SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
    无效,disconnect后立即connect依然失败,过一会儿才能成功。
      

  8.   

    可能只能close()了。断开之后好像一般性都是close()之后,重新connect的。
      

  9.   

    SocketOptionName.KeepAlive 也无效 没办法了
      

  10.   

    你可以先判断下       if (!AAllClientSocket.Connected)
                            {
                                AAllClientSocket.Connect(AEndPoint);
                            }
    看是否已经连接,如果已经连接就不用在连接了!通信最好是问答式的,这样安全!如果连续发送也不是不可以
    ,我可以给你段代码,你参考下 //循环所有DCS端口
                for (int i = 0; i < Class_Const.m_DCS_ClientIPAndPort.Count; i++)
                {
                    IPEndPoint AEndPoint = Class_Const.m_DCS_ClientIPAndPort[i];
                    DataTable Acommand = Class_SQL_DAL.GetTDHandSBH(Class_Const.m_DCS_ClientIPAndPort_ID[i]);
                    //建立socket连接
                    Socket AAllClientSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    AAllClientSocket.ReceiveTimeout = 1000;
                    //    AAllClientSocket.SendTimeout = 100;
                    Thread.Sleep(1000);
                    for (int j = 0; j < Acommand.Rows.Count; j++)
                    {                    //二次表设备号
                        string AstrSBH = Acommand.Rows[j]["SBH"].ToString();
                        //字节形式
                        byte[] ASBH = System.Text.ASCIIEncoding.ASCII.GetBytes(AstrSBH);
                        //数据通道号
                        byte[] ATDH = System.Text.ASCIIEncoding.ASCII.GetBytes(Acommand.Rows[j]["TDH"].ToString());
                        try
                        {
                            //连接服务器
                            
                            Thread.Sleep(500);
                            if (!AAllClientSocket.Connected)
                            {
                                AAllClientSocket.Connect(AEndPoint);
                            }
                            byte[] ARequest;
                            if (AstrSBH == "47")
                            {
                                ARequest = new byte[] { 47, 3, 0, 0, 0, 1,194,69};
                            }
                            else if (AstrSBH == "46")
                            {
                                ARequest = new byte[] { 46, 3, 0, 0, 0, 1,195,148};
                            }
                            else
                            {
                                ARequest = new byte[] { 0x11, ASBH[0], ASBH[1], ASBH[2], ATDH[0], ATDH[1], 3 };
                            }
                            AAllClientSocket.Send(ARequest);                        Class_Log.ShowLogInWindow("即时上传命令发送成功" + AEndPoint.ToString(), 1);
                            byte[] Abyte = new byte[1000];
                            //接受数据
                          AAllClientSocket.Receive(Abyte);
                            //处理数据
                            AnalyzeData(Abyte);
                           //测试
                          // string aabb = System.Text.Encoding.ASCII.GetString(Abyte);
                      
                        //  Class_Log.ShowLogInWindow(aabb, 1);
                            //   AAllClientSocket.Shutdown(SocketShutdown.Both);
                            //关闭连接                        // AAllClientSocket.Disconnect(true);
                        }
                        catch
                        {
                            
                            //显示日志
                            Class_Log.ShowLogInWindow(AEndPoint.ToString() + ":链路不通 ", 1);
                        }
                    }
                    AAllClientSocket.Close();
                }