如题,谢谢^_^代码如下:
                  FD_ZERO(&fdRecv);
FD_SET(sock, &fdRecv);
if( (nRcvNm = select(sock+1, &fdRecv, NULL, NULL, &seltime)) == SOCKET_ERROR)
{
nErrCode = WSAGetLastError();
strcat(pFunNm, "select");
__leave;
}
else if(nRcvNm<=0)
    continue;
if(!FD_ISSET(sock, &fdRecv))
{
contine;
}
nRcvNm = recv(sock, (char *)(pCtrlCd), 1, 0);
if(0==nRcvNm)
{
nErrCode = OWN_ERR;
strcat(pFunNm, "ERROR!");
__leave;
}

解决方案 »

  1.   

    在对方close socket后,recv会返回0
    你说的情况可能是对方把socket关了
      

  2.   

    但是我是accept检查到有新的连接后,才收到的消息啊,我在连接后有发送了数据才关的啊,如果我不用select,直接用非阻塞模式+Sleep就是正确的,请问这是为什么啊?谢谢
      

  3.   

    找本 讲 unix 网络编程的书 看看 selectwindows 上 跟 unix 上的 还有点小 差别,  
    当 select 选中 你正在监听的那个 套接字时, 表示 有新的连接应该 调 if ((newfd = accept(listener, (struct sockaddr *)&remoteaddr,&addrlen)) == -1) 

      perror("accept"); 
    } 新建一个 套接字.
      

  4.   

    然后讲 这个 套接子 添加到 
    集合中FD_SET(newfd, &master);
      

  5.   

    嗯,我是这么做的,在accept后再次调用select,返回后recv就会返回0字节,如上面的代码所示