快速业务通道

深入分析驴子系列(1)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

一直在看驴子的代码,网上进行深入分析的文章不多,也许 这和驴子的代码量太大, 代码质量不高也许有关系。但更多的也许是不想分享,舍不得分享。其实,它本身就是开 源的 不分享人家慢慢看也能看懂 。由于时间关系 我会陆续把分析的文章帖上来,与各 位网友分享,也希望大家拍砖 进行讨论 也把你的心得分享出来。。系列分析文章如果没 有特别注明 以easy mule 0.47为准

CListenSocket 类 的作用就是 监听 等待客户 端的socket 到来 并维护到来的套接字 把accept进来的套接字 加入到list 中

// 该函数的作用是创建本地的listensocket, 是否Accept 连接是由 winsock消息驱动
bool CListenSocket::StartListening()
{
   bListening = true;
   // Creating the socket with SO_REUSEADDR may solve LowID issues if emule was restarted
   // quickly or started after a crash, but(!) it will also create another problem. If the
   // socket is already used by some other application (e.g. a 2nd emule), we though bind
   // to that socket leading to the situation that 2 applications are listening at the same
   // port!
   if (!Create (thePrefs.GetPort(), SOCK_STREAM, FD_ACCEPT, thePrefs.GetBindAddrA(), FALSE/*bReuseAddr*/))
     return false;
   if (!Listen())
     return false;
   m_port = thePrefs.GetPort();
   return true;
}
// 该函数改名为RestartAccept 更合适
// 它的本意 是重新开始接受连接
// 为什么需要重新开始接受连接呢,原因是连接数过多情况 下,
// 会暂时StopListeing (bListening 设置为false;) ,
// 连接数少 的情况下会重新开始接受连接RestartListening;
// 应该注意的是:这个暂停和 重新开始并不实际关闭/打开本地listen端口,只是设置一个bool标志
void CListenSocket::ReStartListening()
{
   bListening = true;
    ASSERT( m_nPendingConnections >= 0 );
   if (m_nPendingConnections > 0)
   {
     m_nPendingConnections--;
     OnAccept(0);
   }
}

銭俊欺栖

void CListenSocket::OnAccept(int nErrorCode)
{
  if (!nErrorCode)      //枠登僅頁倦嗤危列
  {
    m_nPendingConnections++;
    if (m_nPendingConnections < 1)
    {
      ASSERT(0);
      m_nPendingConnections = 1;
    }
    if (TooManySockets(true) && !theApp.serverconnect->IsConnecting()) // 泌惚厮将銭俊議耗俊忖狛謹 賜宀 銭俊僅蝕
    {                                   // 夸唯峭酌油卦指
       StopListening();
      return;
    }
    else if (! bListening)
      ReStartListening(); //If the client is still at maxconnections, this will allow it to go above it.. But if you don''t, you will get a lowID on all servers.
    uint32 nFataErrors = 0;
    while (m_nPendingConnections > 0)
    {
       m_nPendingConnections--;
      CClientReqSocket* newclient;
      SOCKADDR_IN SockAddr = {0};
      int iSockAddrLen = sizeof SockAddr;
      if (thePrefs.GetConditionalTCPAccept() && ! thePrefs.GetProxySettings().UseProxy)
      {
         _iAcceptConnectionCondRejected = 0;
        SOCKET sNew = WSAAccept(m_SocketData.hSocket, (SOCKADDR*)&SockAddr, &

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号