⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 csdn_文档中心_myicq情景分析.htm

📁 csdn10年中间经典帖子
💻 HTM
📖 第 1 页 / 共 5 页
字号:
            (IcqWindow *) *it;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
            (win-&gt;type == type &amp;&amp; (!qid || win-&gt;qid == *qid) </P>
            <P 
            style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            &amp;&amp; (seq == 0 || win-&gt;seq == 
            seq))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            return win;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>&nbsp;&nbsp;&nbsp; return NULL;<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">接上程序<BR>293 if (win) 
            {<BR>294&nbsp;&nbsp;&nbsp;&nbsp; ((CRegWizard *) 
            win)-&gt;onConnect(success);<BR>295&nbsp;&nbsp;&nbsp;&nbsp; 
            return;<BR>296 }<BR>........}</P>
            <P 
            style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">本情景中WIN_REG_WIZARD存在所以进入((CRegWizard 
            *) win)-&gt;onConnect(success);</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">void onConnect(bool 
            success) {<BR>&nbsp;&nbsp;&nbsp; 
            finishDlg.onConnect(success);<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">void 
            CRegFinishDlg::onConnect(bool success)<BR>{<BR>148&nbsp;&nbsp;&nbsp; 
            if (success) {<BR>149&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            CRegWizard *<A name=wiz>wiz</A> = (CRegWizard *) 
            GetParent();<BR>150&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if 
            (wiz-&gt;modeDlg.m_mode == 
            0)<BR>151&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            wiz-&gt;seq = 
            getUdpSession()-&gt;regNewUIN(wiz-&gt;basicDlg.m_passwd);<BR>152&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            else {<BR>153&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            icqLink-&gt;myInfo.qid.uin = 
            wiz-&gt;modeDlg.m_uin;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            wiz-&gt;seq = 
            getUdpSession()-&gt;login(wiz-&gt;modeDlg.m_passwd,STATUS_OFFLINE);<BR>155&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            }<BR>156&nbsp;&nbsp; } 
            else<BR>157&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            onTimeout();<BR>}</P>
            <P 
            style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">modeDlg.m_mode如选中新申请一个QQ号则为0,选中已有QQ号为1,本情景为0所以到151行</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">uint16 
            UdpSession::regNewUIN(const char *passwd)<BR>{<BR>&nbsp;<A 
            href="file:///D:/cldata/study/user_register.htm#regNewUIN_001">001</A>&nbsp;&nbsp; 
            initSession();<BR>&nbsp;<A 
            href="file:///D:/cldata/study/user_register.htm#regNewUIN_002">002</A>&nbsp;&nbsp; 
            UdpOutPacket *out = createPacket(UDP_NEW_UIN);<BR>&nbsp;<A 
            href="file:///D:/cldata/study/user_register.htm#regNewUIN_003">003</A>&nbsp;&nbsp; 
            *out &lt;&lt; passwd;<BR>&nbsp;<A 
            href="file:///D:/cldata/study/user_register.htm#regNewUIN_004">004</A>&nbsp;&nbsp; 
            return sendPacket(out);<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><A 
            name=regNewUIN_001></A>先看001 regNewUIN主要功能是注册一个新ID,</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">void 
            UdpSession::initSession()<BR>{<BR>161 sid = (rand() &amp; 
            0x7fffffff) + 1;   //将sid初值赋值为随机数</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">162 sendSeq = (rand() 
            &amp; 0x3fff);     </P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">163 retryKeepAlive = 
            0;<BR>164 sessionCount = 0;<BR>165<BR>166 memset(window, 0, 
            sizeof(window));<BR>167<BR>168 
            clearSendQueue();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            //清空发送队列<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><A 
            name=regNewUIN_002></A>再看002</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(1) UdpOutPacket 
            *UdpSession::createPacket(uint16 cmd)<BR>{<BR>&nbsp;&nbsp;&nbsp; 
            UdpOutPacket *p = new UdpOutPacket;<BR>&nbsp;&nbsp;&nbsp; p-&gt;cmd 
            = cmd;<BR>&nbsp;&nbsp;&nbsp; p-&gt;seq = 
            ++sendSeq;<BR>&nbsp;&nbsp;&nbsp; createPacket(*p, cmd, 
            sendSeq);<BR>&nbsp;&nbsp;&nbsp; return p;<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(2) void 
            UdpSession::createPacket(UdpOutPacket &amp;out, uint16 cmd, uint16 
            seq)<BR>{<BR>&nbsp;&nbsp;&nbsp; out &lt;&lt; (uint16) MYICQ_UDP_VER 
            &lt;&lt; (uint32) 0;<BR>&nbsp;&nbsp;&nbsp; out &lt;&lt; 
            icqLink-&gt;myInfo.qid.uin &lt;&lt; sid &lt;&lt; cmd &lt;&lt; 
            seq;<BR>&nbsp;&nbsp;&nbsp; out &lt;&lt; (uint16) 0; // Checkcode 
            will be calculated later<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(3) OutPacket 
            &amp;IcqOutPacket::operator &lt;&lt;(uint16 
            w)<BR>{<BR>&nbsp;&nbsp;&nbsp; if (cursor &lt;= data + 
            MAX_PACKET_SIZE - sizeof(w)) 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; *(uint16 *) cursor = 
            htons(w);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; cursor += 
            sizeof(w); }<BR>&nbsp;&nbsp;&nbsp; return (*this);<BR>}</P>
            <P 
            style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">继承关系:UdpOutPacket-&gt;IcqOutPacket-&gt;OutPacket-&gt;Packet</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">cmd = 
            UDP_NEW_UIN,cusor和data的初始化是在哪里做的呢?看代码:</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">class IcqOutPacket : 
            public OutPacket {<BR>&nbsp; public:<BR>&nbsp;&nbsp;&nbsp; 
            IcqOutPacket() {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            cursor = data; }</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp; ...<BR>&nbsp; 
            ...</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp; 
            protected:<BR>&nbsp;&nbsp;&nbsp; char 
            data[MAX_PACKET_SIZE];<BR>&nbsp;&nbsp;&nbsp; char *cursor;};</P>
            <P 
            style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(3)是第一句主要是为了判断cursor的长度+sizeof(w)是否超过了MAX_PACKET_SIZE如没超过就将w转换为网络字节后赋值给cursor当前的地址</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp;&nbsp; 
            然后移动cursor的指针+w</P>
            <P 
            style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(2)中的后几句都是将数据赋给data.&nbsp; 
            也就是说将MYICQ_UDP_VER -0- icqLink-&gt;myInfo.qid.uin -sid - cmd 
            -seq-0连起来赋给data.</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp;&nbsp; 其中 
            MYICQ_UPD_VER = 
            1,icqLink-&gt;myInfo.qid.uin=申请一个QQ号则为0,选中已有QQ号为1,sid=随机数,cmd 
            =UDP_NEW_UIN,seq=随机数</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><A 
            name=regNewUIN_003></A>再看003: *out &lt;&lt; passwd; 
            再给data加上passwd;</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><A 
            name=regNewUIN_004></A>最后004: sendPacket(out)&nbsp; 看看</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"> </P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">uint16 
            UdpSession::sendPacket(UdpOutPacket *p)<BR>{<BR>&nbsp;&nbsp;&nbsp; 
            // Packet must be encrypted before sending to 
            server<BR>1&nbsp;&nbsp;&nbsp; if (p-&gt;cmd != UDP_NEW_UIN 
            &amp;&amp; p-&gt;cmd != 
            UDP_LOGIN)<BR>2&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            p-&gt;encrypt();<BR>3&nbsp;&nbsp;&nbsp; p-&gt;attempts = 
            0;<BR>4&nbsp;&nbsp;&nbsp; p-&gt;expire = time(NULL) + 
            SEND_TIMEOUT;<BR>5&nbsp;&nbsp;&nbsp; 
            sendDirect(p);<BR>6&nbsp;&nbsp;&nbsp; 
            sendQueue.push_back(p);<BR>7&nbsp;&nbsp;&nbsp; return 
            sendSeq;<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">1-2 
            如果cmd不等于注册新ID和登陆的话就加密.</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">expire是定义超时时间, 
            attempts 企图尝试的次数,</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">到达5</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">void 
            UdpSession::sendDirect(UdpOutPacket *out)<BR>{<BR>&nbsp;&nbsp;&nbsp; 
            if 
            (icqLink-&gt;isProxyType(PROXY_HTTP))<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            sendDirect(out, httpProxy.sock);<BR>&nbsp;&nbsp;&nbsp; 
            else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; sendDirect(out, 
            sock);<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">是否使用了代理服务器如没使用就用int 
            sock,它在UpdSession的构造函数中被初始化为 </P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><A 
            name=SocketListener></A></P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">sock = 
            IcqSocket::createSocket(SOCK_DGRAM, this);</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"><A 
            name=CMySocket></A></P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">int 
            IcqSocket::createSocket(int type, SocketListener 
            *l)<BR>{<BR>&nbsp;&nbsp;&nbsp; CMySocket *pSocket = new 
            CMySocket(l);<BR>&nbsp;&nbsp;&nbsp; pSocket-&gt;Create(0, type, 
            FD_READ | FD_CONNECT | FD_CLOSE);<BR>&nbsp;&nbsp;&nbsp; return 
            addSocket(pSocket);<BR>}</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(1) 
            createSocket第一行在堆上创建了一个CMySocket 它继承于CAsyncSocket类,看它的构造函数</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp;&nbsp;&nbsp; 
            CMySocket::CMySocket(SocketListener 
            *l)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; {&nbsp;&nbsp; 
            listener = l;}<BR>&nbsp;&nbsp;&nbsp; 
            SocketListener是一个纯虚函数,它是UdpSession的父类,它改写了SocketListener的onReceive的虚函数。</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(2) 
            createSocket第二行是Create函数,以SOCK_DGRAM(TCP协议)创建了一个Socket对象</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">(3) 看看第三行的代码</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp;&nbsp;&nbsp; 
            inline int addSocket(CAsyncSocket *pSocket)<BR>&nbsp;&nbsp;&nbsp; 
            {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; int sock = 
            *pSocket;<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            sockHash.SetAt(sock, 
            pSocket);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return 
            sock;<BR>&nbsp;&nbsp;&nbsp; }</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">&nbsp;&nbsp;&nbsp; 
            static CMap&lt;int, int, CAsyncSocket*, CAsyncSocket*&gt; 
            sockHash;</P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px"> </P>
            <P style="MARGIN-BOTTOM: 0px; MARGIN-TOP: 0px">void 
            UdpSession::sendDirect(UdpOutPacket *out, int 
            s)<BR>{<BR>203&nbsp;&nbsp; char buf[MAX_PACKET_SIZE + 
            256];<BR>204&nbsp;&nbsp; char *p = buf;<BR>205&nbsp;&nbsp; int n = 
            out-&gt;getSize();&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            <BR>206<BR>207&nbsp;&nbsp; IcqOption &amp;options = 
            icqLink-&gt;options;<BR>208<BR>209&nbsp;&nbsp; if 
            (options.flags.test(UF_USE_PROXY)) 
            {<BR>210&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; switch 
            (options.proxyType) 
            {<BR>211&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; case 
            PROXY_HTTP:<BR>212&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            *(uint16 *) p = 
            htons(n);<BR>213&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            p += 
            sizeof(uint16);<BR>214&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            break;<BR>215<BR>216&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            case 
            PROXY_SOCKS:<BR>217&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            *(uint16 *) p = 
            0;<BR>218&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            p += 
            sizeof(uint16);<BR>219&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            *p++ = 
            0;<BR>220&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            if (options.proxy[PROXY_SOCKS].resolve) 
            {<BR>221&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            // 
            IPv4<BR>222&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 
            *p++ = 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -