设为首页 加入收藏

TOP

1.4.2 具体编码(5)
2013-10-07 15:52:31 来源: 作者: 【 】 浏览:82
Tags:1.4.2 具体 编码

1.4.2  具体编码(5)

  1. HdrLen *= 4;  
  2. totallen = ntohs(pIpHeader->total_len);  
  3. totallen -HdrLen;  
  4. switch(pIpHeader->proto)  
  5. {  
  6. case IPPROTO_ICMP:  
  7. {  
  8. pICMPHead=(struct ICMPPacketHead *)(buf+HdrLen);  
  9. //strL4.Format(" type:%d code:%d\n",  
  10. // pICMPHead->Type, pICMPHead->Code);  
  11. strSourPort = "-";  
  12. strDestPort = "-";  
  13. pdata = ((BYTE*)pICMPHead) + ICMP_HEAD_LEN;  
  14. totallen -ICMP_HEAD_LEN;  
  15. break;  
  16. }  
  17. case IPPROTO_TCP:  
  18. {  
  19. pTCPHead = (struct TCPPacketHead *)(buf+HdrLen);  
  20. sourport = ntohs(pTCPHead->SourPort);  
  21. destport = ntohs(pTCPHead->DestPort);  
  22. //strL4.Format(" sour port:%d,  
  23. // dest port:%d", sourport, destport);  
  24. strSourPort.Format("%d",sourport);  
  25. strDestPort.Format("%d", destport);  
  26. HdrLen = (pTCPHead->HLen)>>4; //事实上只有4位  
  27. HdrLen *= 4;  
  28. pdata = ((BYTE*)pTCPHead)+HdrLen;  
  29. totallen -HdrLen;  
  30. break;  
  31. }  
  32. case IPPROTO_UDP:  
  33. {  
  34. pUDPHead=(struct UDPPacketHead *)(buf+HdrLen);  
  35. sourport = ntohs(pUDPHead->SourPort);  
  36. destport = ntohs(pUDPHead->DestPort);  
  37. //strL4.Format(" sour port:%d,  
  38. // dest port:%d", sourport, destport);  
  39. strSourPort.Format("%d", sourport);  
  40. strDestPort.Format("%d", destport);  
  41. pdata = ((BYTE*)pUDPHead) + UDP_HEAD_LEN;  
  42. totallen -UDP_HEAD_LEN;  
  43. break;  
  44. }  
  45. }  
  46.  
  47. if(pIpHeader->proto == IPPROTO_ICMP)  
  48. strData.Format("type:%d code:%d data:%s",  
  49. pICMPHead->Type, pICMPHead->Code, pdata);  
  50. else strData.Format("  %s", pdata);  
  51.  
  52. strSize.Format("%d", totallen);  
  53. pDlg->AddData(strProto, szSource, strSourPort,   
  54. szDest, strDestPort, strSize, strData);  
  55.  
  56. if(iLen < iRet)  
  57. {  
  58. iRet -iLen;  
  59. bufwork  += iLen;  
  60. pIpHeader = (IPHEADER*)bufwork;  
  61. }  
  62. else  
  63. break; // pIpHeader->total_len == iRet and go out  
  64. }  
  65. else  
  66. { // read last part of buf. I wrote it, but always recv()  
  67. // read exactly the length of the packet  
  68. int iLast = iLen - iRet;  
  69. pLastBuf = new char [iLen];  
  70. int iReaden = iRet;  
  71. memcpy(pLastBuf, bufwork, iReaden);  
  72. iRet =  recv(pDlg->m_s, pLastBuf + iReaden, iLast, 0);  
  73. if(iRet == SOCKET_ERROR)  
  74. {  
  75. dwErr = WSAGetLastError();  
  76. sprintf(szErr, "Error recv() = %ld ", dwErr);  
  77. break;  
  78. }  
  79. else  
  80. {  
  81. bufwork = pLastBuf;   
  82. pIpHeader = (IPHEADER*)bufwork;  
  83. if(iRet == iLast)  
  84.     iRet = iLen;  
  85. else  
  86. { // read all last data  
  87.     iReaden += iRet;  
  88.     iLast -iRet;  
  89.     while(TRUE)  
  90.     {  
  91.         iRet = recv(pDlg->m_s, pLastBuf+iReaden,   
  92. iLast, 0);  
  93. if(iRet == SOCKET_ERROR)  
  94. {  
  95. dwErr = WSAGetLastError();  
  96. sprintf(szErr,   
  97. "Error recv() = %ld ", dwErr);  
  98. break;  
  99. }  
  100. else  
  101. {  
  102. iReaden += iRet;  
  103. iLast -iRet;  
  104. if(iLast <= 0)   
  105. break;  
  106. }     

】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
分享到: 
上一篇1.4.2 具体编码(4) 下一篇1.4.2 具体编码(6)

评论

帐  号: 密码: (新用户注册)
验 证 码:
表  情:
内  容:

·常用meta整理 | 菜鸟 (2025-12-25 01:21:52)
·SQL HAVING 子句:深 (2025-12-25 01:21:47)
·SQL CREATE INDEX 语 (2025-12-25 01:21:45)
·Shell 传递参数 (2025-12-25 00:50:45)
·Linux echo 命令 - (2025-12-25 00:50:43)