情况是这样的:我开了5个线程,都做数据的发送和接收工作,然后,我突然
关掉一端,另外一端就还是等待,等待。阻塞掉了。怎么回事呢?代码部分:
node->sock.fd_array[0]=node->m_ServSocket.m_hSocket;
 node->sock.fd_count=1;
 error=select(0,&(node->sock),NULL,NULL,&iTimeout);
 if (error!=1)
  goto endto;
 error=node->m_ServSocket.Receive(ibuffer,200);

解决方案 »

  1.   

    select函数的返回值有三种情况:大于0,等于0,还有就是-1了。
      

  2.   

    to wzt2000:
    另外一端,已经关闭了,没法子看啊to  RedFire:
    我只允许值等于1的情况,所以,阻塞肯定不是在select上面阿
      

  3.   

    我做过类似的程序,我也不知为什么,不过如果你把select的第一个参数由1改为0也许更合适,这里我给你一个我做的成功的例程的一部分:
    fd_set fds;
    FD_ZERO(&fds);
    FD_SET(pAccept->m_acceptSock,&fds);
    while(1){
        select(pAccept->m_acceptSock+1,&fds,NULL,NULL,NULL);
        if(FD_ISSET(pAccept->m_acceptSock,&fds)){
    int  nBytes=read(pAccept->m_acceptSock,pAccept->m_buff+pAccept->m_buffLen,20);
        if(nBytes<0){
    pAccept->m_pNetServer->ClientClose(pAccept);
    pAccept->m_threadID=0;
    return NULL;
        }
        else if(nBytes>0){
             pAccept->m_buffLen+=nBytes;
             pAccept->m_pNetServer->ClientReceive(pAccept);
        }
    你可以参照一下,这样可以么?
      

  4.   

    好象select是个阻塞涵数,读满缓冲才返回,不过可以通过另外一个API改变这种状况,我有点记不清了。
      

  5.   

    哈~谢谢,找到答案了,greysky123已经做得很不错了。:D