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

socket的select一直回来超时,只有32分了。

2012-08-19 
socket的select一直返回超时,只有32分了。。。。我把我的部分代码贴出来吧bool xSocket::s_waitimeout(int typ

socket的select一直返回超时,只有32分了。。。。
我把我的部分代码贴出来吧
bool xSocket::s_waitimeout(int type,int _timeout)
{
fd_set _fds;
struct timeval tv;

tv.tv_sec = _timeout;
tv.tv_usec = 0;

int count = 3;
while(count)
{
FD_ZERO(&_fds);
FD_SET(_sock, &_fds);
switch(type)
{
case 0: select(0,NULL,&_fds, NULL, &tv); break; // send
case 1: select(1,&_fds,NULL, NULL, &tv); break; // recv
}

if(FD_ISSET(_sock,&_fds)) break;

count--;
if(count<=0) return false;
continue;
}
return true;
}


bool xSocket::s_send(const char* szrequest,int size)
{
if(_sock==INVALID_SOCKET || szrequest==NULL) return false;

const char* readbuf = szrequest;
int readsize = size;

if(s_waitimeout(0,3)==false) return false;

while(readsize)
{
int ret = send(_sock,readbuf,readsize,0);
if(ret==SOCKET_ERROR) return false;
if(ret==0) break;

readbuf += ret;
readsize -= ret;
}

return true;
}

bool xSocket::s_recv(char* pbuff,long size)
{
if(_sock==INVALID_SOCKET || pbuff==NULL) return false;

if(s_waitimeout(1,4)==false) return false;

memset(pbuff,0,size);

char* readbuf = pbuff;
long readsize = size;

while (readsize>0)
{
int ret = recv(_sock,readbuf,readsize,0);
if(ret==SOCKET_ERROR)
{
printf("%s\n",strerror(errno));
return false;}
if(ret==0) break;
if(ret<readsize) break;

readbuf += ret;
readsize -= ret;

if(readsize) Sleep(20);
}

return true;
}


下面的调用的时候,RTSP_SETUP和RTSP_PLAY相当于调用了s_send,

RTSP_Respond相当于调用了s_recv;

我跟踪了一下,发现每次select的返回值都是0,也就是说每次FD_ISSET(_sock,&_fds)这个都会失败,

说明一下执行的情况:第一次发送成功,接收成功;第二次发送成功,接收失败(原因就是上面的一条)

rect = RTSP_SETUP();
if (rect)
{
printf("SETUP send ok\n");
rect = RTSP_Respond();

if (rect)
{
printf("send ok\n");
}

while (1)
{
if (rect)
{
printf("SETUP recv ok\n");
rect = RTSP_Respond();
}
else
break;
}
}
else
printf("SETUP send failed\n");

rect = RTSP_PLAY();
if (rect)
{
printf("PLAY send ok\n");
rect = RTSP_Respond();

if (rect)
{
printf("play ok\n");
}
else
{
printf("play failed\n");
}
while (1)
{
if (rect)
{
printf("PLAY recv ok\n");
rect = RTSP_Respond();
}
else
printf("failed\n");
break;
}
}
else
printf("PLAY send failed\n");

[解决办法]
那么把
switch(type)
{
case 0: select(0,NULL,&_fds, NULL, &tv); break; // send
case 1: select(1,&_fds,NULL, NULL, &tv); break; // recv
}

if(FD_ISSET(_sock,&_fds)) break;
改下,对select返回值进行判断,只有不是 0 -1的时候执行if(FD_ISSET(_sock,&_fds)
[解决办法]
实在是不知道楼主怎么知道select超时的,哪一行判断了select返回值了 ?

如果select是错误,是超时,或者有数据,fd_set的行为都不一样,你就这么FD_ISSET去判断能对么。

热点排行