select后recv的问题
windows下
struct timeval timeout ;
fd_set r;
int ret;
FD_ZERO(&r);
FD_SET(clientC, &r);
timeout.tv_sec = 5; //连接超时2秒
timeout.tv_usec = 0;
ret = select(0, 0, &r, 0, &timeout);
if ( ret <= 0 )
{
printf("超时\n");
SetEvent(g_envent_Ready[id-1]);
SetEvent(g_envent_OneBmpEnd[id-1]);
closesocket(clientC);
clientC = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
memset(&clientAddress,0,sizeof(clientAddress));
EnterCriticalSection(&cs);
ID_connect[id-1] = false;
LeaveCriticalSection(&cs);
break;
}
if ((recv_num = recv(clientC,(char *)&ready,1,0)) == SOCKET_ERROR || recv_num == 0)
{
printf("recv ifready failed : %d\n",WSAGetLastError());
SetEvent(g_envent_Ready[id-1]);
SetEvent(g_envent_OneBmpEnd[id-1]);
closesocket(clientC);
clientC = socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
memset(&clientAddress,0,sizeof(clientAddress));
EnterCriticalSection(&cs);
ID_connect[id-1] = false;
LeaveCriticalSection(&cs);
break;
}
忽略socket错误时的处理过程
我select成功后马上recv,为什么recv的返回值是-1,错误代码是10035:当前资源暂时不可获得
中间加个sleep(1000)就没问题
感觉用sleep不好,那是不是只要select成功了之后就不用管recv的返回值?直到我recv到数据就OK?
[解决办法]
ret = select(0, 0, &r, 0, &timeout);
的第二个参数是rd,
第三个参数是wd
第四个参数是ed,
你第三个参数应该放在第二个参数上:
ret = select(0, &r, 0, 0, &timeout);
[解决办法]
select函数用法就写错了
改成这样!
select(clientC+1, &r, 0, 0, &timeout);