若将超时值设置为( 0 , 0),表明s e l e c t会立即返回,允许应用程序对s e l e c t操作进行“轮询”。出于对性能方面的考虑,应避免这样的设置。。s e l e c t成功完成后,会在f d _ s e t结构中,返回刚好有未完成的I / O操作的所有套接字句柄的总量。若超过t i m e v a l设定的时间,便会返回0。不管由于什么原因,假如s e l e c t调用失败,都会返回S O C K E T _ E R R O R。 判断select返回值了吗?
ti = select(NULL,&fdRead,&fdWrite,NULL,&mWaitTime); if (FD_ISSET(ts,&fdRead)) CanRcvFlag[i] = true; //判断第i路是否可读 if (FD_ISSET(ts,&fdWrite)) CanSendFlag[i] = true; //判断第i路是否可写 else CanSendFlag[i] = false; 上面的语句中select的返回值是2, CanSendFlag[i] = true,但是这种情况下send返回的是-1,什么意思?为什么检测到线路是可以发送的, 但是send却发送失败呢?
==
可以,代码参考
http://search.csdn.net/Expert/topic/2057/2057746.xml?temp=.6641046
{
// TODO: Add your specialized code here and/or call the base class
while (Loop)
{
JudgeBlocking();
MainProc();
Sleep(1);
}
return CWinThread::Run();
}
void mComm::JudgeBlocking()
{
int i,ti;
char * telnum;
SOCKET ts;
timeval mWaitTime;
fd_set fdRead,fdWrite; mWaitTime.tv_sec = 0;
mWaitTime.tv_usec = 0;
FD_ZERO(&fdRead);
FD_ZERO(&fdWrite); for (i=0;i<MAXCLIENTNUM;i++)
{
ts = theCommApp->GetSocket(i); //得到第i路的socket号
if(ts!=NULL)
{
FD_SET(ts,&fdRead);
FD_SET(ts,&fdWrite);
ti = select(NULL,&fdRead,&fdWrite,NULL,&mWaitTime);
if (FD_ISSET(ts,&fdRead))
CanRcvFlag[i] = true; //判断第i路是否可读
if (FD_ISSET(ts,&fdWrite))
CanSendFlag[i] = true; //判断第i路是否可写
else
CanSendFlag[i] = false;
FD_ZERO(&fdRead);
FD_ZERO(&fdWrite);
}
}
}int RcvPoint[MAXCLIENTNUM];
void mComm::MainProc()
{
int i,ti;
ti=0;
for (i=0;i<MAXCLIENTNUM;i++)
{
if (CanRcvFlag[i])
{
CanRcvFlag[i] = false;
ti = recv(theCommApp->GetSocket(i),&Rcvbuff[i][RcvPoint[i]],MAXPACKAGELEN-RcvPoint[i],0); //MAXPACKAGELEN定义为1000
if ((ti!=SOCKET_ERROR)&&(ti>0))
{
…… //读接收到的数据
}
else
{
…… //出错
}
}
}
}
为什么CanRcvFlag[i])已经判断为TRUE了,就是有数据可读了,为什么还会出现recv返回SOCKET_ERROR同样用判断出CanSendFlag[i]为TRUE了,为什么send还返回SOCKET_ERROR?为什么select判断的结果和实际的不相符合?????
recv和send函数如果返回SOCKET_ERROR,判断是否为WSAEWOULDBLOCK错误?对于非锁定套接字recv函数返回WSAEWOULDBLOCK说明:没有收到数据,稍后再次检查。
recv和send函数如果返回0,说明数据接收结束了。
判断select返回值了吗?
if (FD_ISSET(ts,&fdRead))
CanRcvFlag[i] = true; //判断第i路是否可读
if (FD_ISSET(ts,&fdWrite))
CanSendFlag[i] = true; //判断第i路是否可写
else
CanSendFlag[i] = false;
上面的语句中select的返回值是2,
CanSendFlag[i] = true,但是这种情况下send返回的是-1,什么意思?为什么检测到线路是可以发送的, 但是send却发送失败呢?
如果时间设成0,好象select模型也不能立刻检查到网络的最新情况,比如如果将网络的网线断开,select检查的结果仍然是可发送的,这时send是成功的,但一段时间后会检查到不可发送,如果再将网络恢复,select在一段时间的延迟后select检测可发送(但此时select的返回值是2),但send是-1怎么回事?为什么select检测到网络恢复可以发送了,但send却不能发送呢?
请解释解释!!!
你所说的“轮询”是不是指不停地用select检查网络的状况??我是基本不停的在用select检查的,如果不是,你的“轮询”指的是什么?