SOCKET 超时问题。。
Mycro 2005-05-09 04:42:08 我用select 设置了10秒接收超时,结果
确实10会超时;
但问题来了,我接受的数据很大,我每次接收 1024 bytes,
然后用循环,接受;
发现,很慢。。。
后来发现,循环里最后一次接收,数据时,偶尔会有10秒左右,
我猜这应该是发生了10秒的超时;而这个超时是我不想要的,
因为,没有数据了,就是接收完了;
请问大虾们,是怎么 解决的,有没有类似的,现成代码?
----------------------------------
备注,我的代码:
//接收超时设置
int rv = 0;
struct timeval outtime ; // 超时结构
FD_SET fdr = {1, PinSock};
outtime.tv_sec = m_TimeOut/1000;
outtime.tv_usec =0;
int rc = ::select(0, &fdr, NULL, NULL, &outtime);//检查可读状态
if(SOCKET_ERROR == rc)
{
int err = WSAGetLastError();
PinSock = NULL;
return -1;
}
if(rc == 0) //超时发生,无可读数据
{
m_sLastError += "\r\n\r\n********** 接收超时 **********\r\n\r\n";
int err = WSAGetLastError();
PinSock = NULL;
return -1;
}
else
{
//接收数据
rv = recv(PinSock,(char *)recvbuf, MAX_RECV_BUFFER,0);
if(rv == SOCKET_ERROR)
{
m_sLastError += "通讯错误:" + m_Msg;
}
}
//_debug
char buf[256];
memset(buf,0,256);
while(rv > 0)
{
nRvCount += rv;
if(rv < MAX_RECV_BUFFER)
{
memset(recvbuf + rv,0,MAX_RECV_BUFFER + 1 - rv);
}
pData += recvbuf;
rv = recv(PinSock,(char *)recvbuf, MAX_RECV_BUFFER,0);
}