不是吧,,执行完就返回吧!listten(slisten,n);
while(1)
{
   等待连接,开辟新的 线程;
 }
closesocket(slisten);结束;

解决方案 »

  1.   

    listen( ):用于面向连接服务器,表示它愿意接收,需在accept( )之前调用,通知TCP,服务器准备好接收连接
    accept( ):使服务器等待来自某客户进程的实际连接,连接建立,accept()返回,得到新的数据套接字ns
    所以:
    listten(slisten,n);
    while(1)
    {
      if(INVALID_SOCKET !=(socketControl=accept(...)))
        开辟新的 线程;
    }
    closesocket(slisten);
      

  2.   

    这会的代码全,刚才为了说明问题:
    listten(slisten,n);
    while(1)
    {
      iaddrsize=sizeof(client);
      sclient=accept(slisten,(struct sockaddr *)&client,&iaddrsize);
      if(INVALID_SOCKET ==sclient)
       {
         break;
         }
      hthread=createthread(null,0,clientthread,(lpvoid)sclient,0,&dwtrreadid);
      if(hthread==NULL)
      {
       break;
      }
      closehandle(hthread);
     }
    closesocket(slisten);大致的过程就是这个样子的!
      

  3.   

    呵呵,socket有两种工作模式,一个是阻塞的,一个是非阻塞的,socket创建时默认是阻塞的,因此在创建后直接listen会一直等待直到有连接请求进来或超时。可以通过以下的方法来将socket设置为非阻塞的的:
    int non_block = 1;
    ioctlsocket(socket, FIONBIO, &non_block)
    在非阻塞的socket上listen会直接返回,然后当有连接请求时会有一个系统事件来通知你,再调用accept就可以了。
    还可以用WSASocket来创建overlapped i/o模式的socket,具体的情况你可以去看看MSDN的相关资料。
      

  4.   

    其实对于原始的套接字原语,LISTEN是一个阻塞的调用。
    当有客户端连接时,它返回.
    要不断地响应客户的连接请求就必须要:WHILE(1)LISTEN();类似的操作。但是对于UNIX下的TCP套接字也就是俗称的伯克利套接字它是这样工作:(WINSOCK和它一样)服务端过程:
    SOCKET建立通讯点。
    BIND将服务器IP和端口绑定到SOCKET中。
    LISTEN服务器开始侦听(非阻塞)建立客户连接队列列表等
    ACCEPT调用(阻塞)。当客户端有CONNECT请求时,ACCEPT结束调用并返回。要不停地阻塞以和多个客户连接就必须用WHILE(1)ACCEPT();等类似的操作。
    在循环中不断地等待客户的连接请求。