原代码如下:
        //开始监听
        public bool Open()
        {
            string strTemp = "";
            int length = 0;
            byte[] tmpByte;
            string strFrame = "";
            string meterNo = "";            if (ListenerFlag)
            {
                MyServer = new IPEndPoint(this.IP, this.Port);
                socketForClient = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                socketForClient.Bind(MyServer);
                socketForClient.Listen(50);   //50为可连接的链接数
                ((RichTextBox)m_richTextBox).AppendText("开始侦听:" + DateTime.Now.ToString() + "\r\n");
            }
            else
            {
                try
                {
                    ((RichTextBox)m_richTextBox).Text += "停止侦听" + "\r\n";
                    if (newSocket != null)
                    {
                        if (newSocket.Connected)
                        {
                            newSocket.Shutdown(SocketShutdown.Both);
                        }
                        newSocket.Close();
                    }
                    if (socketForClient != null)
                    {
                        socketForClient.Close();
                    }
                    GC.Collect();                }
                catch (Exception ex)
                {
                    MessageBox.Show("停止侦听---" + ex.ToString());
                }
                return false;
            }            while (ListenerFlag)
            {
                //返回可以用以处理连接的Socket实例                if (socketForClient!=null)
                    newSocket = socketForClient.Accept();             //停止监听时此处会出错                remoEP = (IPEndPoint)newSocket.RemoteEndPoint;                newSocket.Blocking = true;          //阻塞方式                if (newSocket.Connected)
                {
                    ////newSocket.ReceiveTimeout = 10000;                    ((RichTextBox)m_richTextBox).Text += DateTime.Now.ToString() + ":" + "与客户端 " + remoEP.Address.ToString() + " 建立了连接" + "\r\n";
                    //接受数据
                    while (true)
                    {
                        tmpByte = new byte[DEALLEN];
                        //temp = AcceptBytes();
                        strTemp = "";
                        length = newSocket.Receive(tmpByte, tmpByte.Length, 0);
                        for (int i = 0; i < length; i++)
                        {
                            strTemp += tmpByte[i].ToString("X2") + " ";
                        }
                        ////strTemp = Encoding.BigEndianUnicode.GetString(tmpByte);  
                        strTemp += " " + DateTime.Now.ToString();
                        //length = AcceptBytes();
                        //接收心跳帧
                        if (length == 18)
                        {
                            meterNo = "";
                            ((RichTextBox)m_richTextBox).Text += "心跳数据:" + strTemp + "\r\n";
                            //SendBytes("680C0C6841160000350608000E411000F916");
                            strFrame = "680C0C6841160000350608000E411000F916";
                            ((RichTextBox)m_richTextBox).Text += "心跳应答:" + strFrame + " " + DateTime.Now.ToString() + "\r\n";
                            if (!loginFlag)
                            {
                                ((RichTextBox)m_richTextBox).Text += "终端:" + meterNo + "---上线" + "\r\n";
                                loginFlag = true;
                            }
                            SendBytes(strFrame);
                            ////tmpByte = Algol.GetHexBytes(strFrame);
                            ////socketForClient.Send(tmpByte, tmpByte.Length, 0);
                        }
                        else if (length > 0)
                        {
                            ((RichTextBox)m_richTextBox).Text += strTemp + "\r\n";
                        }
                        //客户端断开时,length为0                        if (length == 0)
                        {
                            ((RichTextBox)m_richTextBox).Text += "客户端已断开连接,重新开始侦听" + "\r\n";
                            if (newSocket != null)
                            {
                                newSocket.Shutdown(SocketShutdown.Both);
                                newSocket.Close();
                            }
                            break;
                        }                    }
                }
            }
            return true;
        }执行停止监听时                 if (socketForClient!=null)
                    newSocket = socketForClient.Accept();             //停止监听时此处会出错此处会出错,请问如何解决

解决方案 »

  1.   

    仔细想了一下,发现有以下可能:
    1、你使用的是2.0以下的.net,所以在工作线程中操作UI线程的(RichTextBox)m_richTextBox编译没有报错。
    2、你在UI线程里通过一个button控制ListenerFlag变量,然后再运行open方法进行开始停止。
    呵呵,以上是推测,我估计的问题出在:
    if (newSocket != null)
                        {
                            if (newSocket.Connected)           //.Connected反映最近操作时的连接状态
                            {
                                newSocket.Shutdown(SocketShutdown.Both);
                            }
                            newSocket.Close();
                        } 
    在SDK里,这样说明:
    Connected 属性的值反映最近操作时的连接状态。如果您需要确定连接的当前状态,请进行非阻止、零字节的 Send 调用。如果该调用成功返回或引发 WAEWOULDBLOCK 错误代码 (10035),则该套接字仍然处于连接状态;否则,该套接字不再处于连接状态。
    所以,估计你的代码返回的是false,所以没有Shutdown直接Close了,引发了下边while里边的异常。
    推测而已,你可以看看是不是if里边的语句没有执行!
      

  2.   


    ....
    while(true)
    {
     try
      {
        tcpClient = server.AcceptTcpClient();
        
        NetworkStream ns = tcpClient.GetStream();
        .....
        接收信息
         做自己需要做的事
         ns.Close();
        tcpClient.Close();
       }
    catch(Exception ex)
    {
    if (null != ns)
    {
    ns.Close();
    }
    if (null != tcpClient)
    {
    tcpClient.Close();
    }
    Console.WriteLine(ex.Message + " AcceptTcpClient error \r\n" + ex.StackTrace);
    }    
      

  3.   

    zzultc  你好!谢谢你的分析 能否可以跟你QQ聊一下,我的QQ是253878078