代码如下:           
            listener = new TcpListener(ip, _port);
            listener.Start();
            while (live)
            {
                s = listener.AcceptSocket(); //如果没有客户端连接,就停在这里,即使你while()括号里面设置了布尔值也没用
                thr th = new thr(s);            }
  求解啊。。高手来

解决方案 »

  1.   

    不是真正的死循环,,有办法解决的,,我老师让我用 begin、、end,,不过不会用
      

  2.   

    那不是死循环,而是阻塞,也就是来一个连接那个AcceptSocket()才返回,不来连接就一直停在那个函数的地方,你在接收数据时也会遇到这个问题。有两种解决方案:
    方法一:创建一个线程调用监听函数,这样阻塞时只阻塞那个线程,对主线程没有影响。
    方法二:使用异步通信模式,也就是把AcceptSocket改称BeginAccept和EndAccept,调用BeginAccept时,第一个参数是一个回调函数,指明来一个连接后需要进入哪个函数执行,然后在那个函数中执行EndAccept。接受一个连接后,别忘了再Begin一下,否则再来连接就不能接受了。示例代码如下:        public bool StartListening(string strIP, int nPort)
            {
                IPAddress _ipAddress = IPAddress.Parse(strIP);
                IPEndPoint ip = new IPEndPoint(_ipAddress, nPort);            try
                {
                    sListener = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                    sListener.Bind(ip);
                    sListener.Listen(nPort);                // 回调函数,当有连接时进入AcceptEnd函数执行
                    AsyncCallback asyncCallback = new AsyncCallback(AcceptEnd);
                    sListener.BeginAccept(asyncCallback, sListener);                return true;
                }
                catch
                {
                    return false;
                }
            }        public void AcceptEnd(IAsyncResult pIAsyncResult)
            {
                // 接受连接,并放入哈希表htSessions
                Socket socket = sListener.EndAccept(pIAsyncResult);
                ClientSocket session = new ClientSocket(socket);
                htSessions.Add(session.nID, session);            // 开始接收客户端数据
                session.socketClient.BeginReceive(byRecvBuf, 0, byRecvBuf.Length, SocketFlags.None, new AsyncCallback(ReceiveData), session.socketClient);            // 重新开始准备接受连接
                AsyncCallback asyncCallback = new AsyncCallback(AcceptEnd);
                sListener.BeginAccept(asyncCallback, sListener);
            }
      

  3.   

    楼上的AcceptSocket改称BeginAccept和EndAccept就可以解决的,再说你这不是死循环,是正常的执行.因为你要求程序停在那里的.就象你自己的注释说的,//如果没有客户端连接,就停在这里,即使你while()括号里面设置了布尔值也没用
    ,呵呵,不要把这当死循环来考虑.
      

  4.   

    服务端是循环监听,他监听到socket会开线程或异步来处理,做相应操作,与此同时需要循环回去好继续监听。监听listener.AcceptSocket(); 这句是阻塞的,有socket连进服务端才会继续往下执行
      

  5.   

    我有一想法,在死循环外面加一个BOOL作为开关
    bool b= false;
    while(true)
    {
       if(b)
         {
          break;
         }
         下面再写其他代码,如果你要停止这个死循环, 改变变量b的值为true
    }