18,356
社区成员
发帖
与我相关
我的任务
分享
//Connect 类型是我封装的一个类型,其中的m_socket成员就是套接字
int selcount=0;
SOCKET maxs=0;
timeval timeout;
timeout.tv_sec=0;timeout.tv_usec=50;
fd_set rfd;
fd_set wfd;
fd_set efd;
FD_ZERO (&rfd); //读
FD_ZERO (&wfd); //写
FD_ZERO (&efd); //异常
for(int i=0,count=recvarr.GetSize();i<count;i++)
{
Connect * con=recvarr[i];//recvarr 中的是需要接收数据的连接(已成功建立连接的连接),前面的代码的原因,第一个连接总是在这个数组的最后。
FD_SET(con->m_socket,&rfd);
if(con->m_socket>maxs)
maxs=con->m_socket;
}
for(int i=0,count=conarr.GetSize();i<count;i++)
{
Connect * con=conarr[i];//conarr 中的是正在连接的连接
FD_SET(con->m_socket,&wfd);
FD_SET(con->m_socket,&efd);
if(con->m_socket>maxs)
maxs=con->m_socket;
}
selcount=::select(maxs+1,&rfd,&wfd,&efd,&timeout);
if(selcount>0)
{
DWORD now=::timeGetTime();
for(int i=0,count=conarr.GetSize();i<count;i++)//先处理正在连接的连接
{
Connect * con=conarr[i];
if(FD_ISSET(con->m_socket,&efd))
{
con->m_theLastRecvTime=now;
con->errorOccurred(Connect::ErrorCode_ConnectFailed);
con->set_isNeedDisconnect();//发生异常
}
else if(FD_ISSET(con->m_socket,&wfd))
{
con->m_theLastRecvTime=now;
con->changeState(Connect::ConState_connected);//连接成功
}
}
for(int i=0,count=recvarr.GetSize();i<count;i++)//开始接收数据
{
Connect * con=recvarr[i];//断点A 条件是con->m_socket==XX,XX为指定的套接字
if(FD_ISSET(con->m_socket,&rfd))//连接数 过多时,在recvarr后面的一些套接字在这里的判断就为假
{
con->m_theLastRecvTime=now;
int recvlen=::recv(con->m_socket,Manager.m_RecvBuf,PDDTCPManager::RecvBufLen,0);//断点B 条件是con->m_socket==XX,XX为指定的套接字
//接收数据
if(recvlen>0)
{
con->recv(Manager.m_RecvBuf,recvlen);//处理接收到的数据
}
else
{
con->errorOccurred(Connect::ErrorCode_OtherSideDisconnect);
con->set_isNeedDisconnect();//发生错误
}
}
}
}
//.h
class XXX_fd_set
{
public:
XXX_fd_set(void);
~XXX_fd_set(void);
private:
fd_set * m_pFd_set;
u_int m_nMaxCount;
public:
void SetMaxCount(u_int count);
void Set(SOCKET s);
void Zero();
bool IsSet(SOCKET s);
operator fd_set *() const;
};
//.cpp
XXX_fd_set::XXX_fd_set(void)
:m_pFd_set(0)
,m_nMaxCount(0)
{
}
XXX_fd_set::~XXX_fd_set(void)
{
if(m_pFd_set)
delete m_pFd_set;
}
void XXX_fd_set::SetMaxCount(u_int count)
{
if(count>this->m_nMaxCount)
{
fd_set * ls=this->m_pFd_set;
this->m_pFd_set=(fd_set *)(new char [sizeof(u_int)+sizeof(SOCKET)*count]);
if(ls)
{
this->m_pFd_set->fd_count=ls->fd_count;
::memcpy(this->m_pFd_set->fd_array,ls->fd_array,sizeof(SOCKET)*ls->fd_count);
}
else
this->m_pFd_set->fd_count=0;
this->m_nMaxCount=count;
}
}
void XXX_fd_set::Set(SOCKET s)
{
if(this->m_pFd_set)
{
for(u_int i=0;i<this->m_pFd_set->fd_count;i++)
if(this->m_pFd_set->fd_array[i]==s)
return;
if(this->m_pFd_set->fd_count<this->m_nMaxCount)
{
this->m_pFd_set->fd_array[this->m_pFd_set->fd_count]=s;
this->m_pFd_set->fd_count++;
}
}
}
void XXX_fd_set::Zero()
{
if(this->m_pFd_set)
{
this->m_pFd_set->fd_count=0;
}
}
bool XXX_fd_set::IsSet(SOCKET s)
{
return this->m_pFd_set!=0 && __WSAFDIsSet(s,this->m_pFd_set);
}
XXX_fd_set::operator fd_set *() const
{
return this->m_pFd_set;
}