首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C语言 >

select后recv的有关问题

2013-10-12 
select后recv的问题windows下struct timeval timeout fd_set rint retFD_ZERO(&r)FD_SET(clientC, &r)

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返回大于0时,说明描述符已经就绪了,那我recv应该能得到数据,可是为什么recv错误,错误代码10035,无法立即完成一个非阻止性套接字操作。而我等待一段时间再recv就能得到数据,我的问题就在这里。


select函数用法就写错了
改成这样!
select(clientC+1, &r, 0, 0, &timeout);

热点排行