我用TCP方式建立一个socket服务端程序,部分代码如下:
listen(sock, 2);
accept(...);
就是说服务端允许两个客户端连接,调用accept函数是线程被阻塞,等待客户端连接,假如有客户端A和B,
问题:
如果A先连接,accept函数会立即返回吗?
然后如果B也连接,是否要重新调用一次accept函数?谢谢指教!

解决方案 »

  1.   

    accept(.......)这个函数也是阻塞函数,只有客户端连接上来了才会返回,不然整个程序都停留在accept出现的地方阻塞着,一直等着有客户端连接上来accept返回后才继续执行下去
    <windows网络编程> 第8章 I/O模型
      

  2.   

    1、会返回,只要有连接请求即可。
    2、看你的程序了,在你的程序中是否会再次调用accept是由您的程序来决定的。
      

  3.   

    listen(sock, 2);的意思理解错了!listen(sock,2)的意思是,如果在同一时间有3个客户端connect其中的一个会被accept,另外一个被系统自动排队,最后一个将被拒绝.
    等系统处理完第一个连接以后,第二个连接也会被接受,这时系统又能缓冲一个连接了.如果两个连接都处理完了,系统会恢复到刚才的状态.(可以接受一个连接,缓冲一个,拒绝其他的)
    所以最大连接数和listen没有任何联系,listen限制单位时间的同时连接数量.
      

  4.   

    如果要频繁的响应客户的连接与断开,请用IOCP模型
      

  5.   

    accept始终是阻塞的。如果有多个客户连接,WINSOCK会自动为你建立一个队列等待连接,队列的长度由你的listen函数的第二个参数指定。好像这个值最大是5.
      

  6.   

    用异步消息处理模型:WSAAsyncSelect(m_clientSocket,this->m_hWnd,WM_RECEIVE,FD_ACCEPT);TCP UDP 都可以使用,我试过了!
      

  7.   

    用select模型,这样你的accept就不需要多次调用了
      

  8.   

    同意 Hellboy(int argc, char* argv[]) .你的确把2理解错了.