大家好:
      我对listen函数不是很理解。一般都会把listen函数放到while循环外面,例如:
            ..........
               Socket server;
               server.Bind(iep);
               server.listen(20);
               while(true)
                  
               {
                 Socket client = server.Accecpt();                  ..................
                }        通过无限循环接收客户的链接,然后进行通信。我不理解的是listen()就在函数启动时执行一次,当执行到while循环listen函数已经执行完毕,也就是监听函数无效了,当有其他客户端链接进来的时候,不久无法监听当前是否有客户链接信息吗?
           带着上面的疑问,我把listen函数放到while循环里面,如下: 
              server.Bind(iep);
             Console.WriteLine("wait for clients connecting");
            while (true)
            {                //
                server.Listen(20);
                Socket client = server.Accept();
                ClientThread newclient = new ClientThread(client);                Thread newthread = new Thread(new ThreadStart(newclient.ClientService));
                newthread.Start();
            }这个函数执行结果和上面函数代码执行效果是一样,不知道listen函数实现机制是什么样的,难道这个函数像一个线程一样,一时处于运行状体,知道关闭服务器吗?    我的问题可能有些好笑,但是还请各位高手给予解答。非常感谢

解决方案 »

  1.   

    当执行到while循环listen函数已经执行完毕,也就是监听函数无效了,为什么会认为监听无效呢,这个方法只是将Socket转换为监听状态,只要这个Socket存在,那么监听状态一直持续。当有其他客户端链接进来的时候,不久无法监听当前是否有客户链接信息吗? Accept是干什么的?
      

  2.   

    谢谢你们的回答。  Accept函数应该是在listen函数监听有用户连接消息以后,在调用accept函数接收函数的连接。 我不知道这样理解是否合理。
      

  3.   

     我把listen函数放到循环里面没有发现和放在外面有啥区别,不过我使用非常简单的通信来实验的。
      

  4.   

      Accept函数应该是在listen函数监听有用户连接消息以后,在调用accept函数接收函数的连接。 我不知道这样理解是否合理。
    -----------------------------------
    错误。Listen只是将Socket置为监听状态,并不负责实际的建立连接工作。只有在监听状态下,Socket才能接受客户端发起的连接。而Accept是在有客户端发起连接的时候,接受连接请求,双方正式建立连接。
      

  5.   

    小弟对listen函数也有同样的疑惑,百度到此,看来有前人已经解决了,thanks