关于PeerAcceptor
PeerAcceptor使得本机作为BT的服务器端与网络上的peer进行通信。这样我们的BT既有服务器端,又有客户端。
PeerAcceptor实现
PeerAcceptor的整个逻辑有以下两个主要步骤:
(1)创建TCP套接字并监听。设置socketreactor,这样在同步事件处理器中就能将器套接字描述符加入到描述符集中进行监视。
bool CPeerAcceptor::Startup()
{
for (int i = 7681; i < 7690; ++i)
{
CreateTCPSocket();
if (CSocket::Bind(NULL, i) == true)
{
m_nPort = i;
CSocket::Listen();
CSocket::SetReactor(m_pTask->GetSocketReactor());
CSocket::SetHandleMask(READ_MASK);
return true;
}
}
return false;
}
(2)处理套接字事件。当套接字可读时,表示有客户端连上了,我们调用accept返回一个与客户端通信的套接字。然后我们再把这些塞给peermanager让它去创建一个peer。
int CPeerAcceptor::HandleRead()
{
string strIpAddr;
int nPort;
int fd = CSocket::Accept(strIpAddr, nPort);
if (fd != -1)
{
if (!m_pTask->GetPeerManager()->AddAcceptedPeer(fd, strIpAddr.c_str(), nPort))
{
close(fd);
}
}
return 0;
}