1.4.2 具体编码(5)
- HdrLen *= 4;
- totallen = ntohs(pIpHeader->total_len);
- totallen -= HdrLen;
- switch(pIpHeader->proto)
- {
- case IPPROTO_ICMP:
- {
- pICMPHead=(struct ICMPPacketHead *)(buf+HdrLen);
- //strL4.Format(" type:%d code:%d\n",
- // pICMPHead->Type, pICMPHead->Code);
- strSourPort = "-";
- strDestPort = "-";
- pdata = ((BYTE*)pICMPHead) + ICMP_HEAD_LEN;
- totallen -= ICMP_HEAD_LEN;
- break;
- }
- case IPPROTO_TCP:
- {
- pTCPHead = (struct TCPPacketHead *)(buf+HdrLen);
- sourport = ntohs(pTCPHead->SourPort);
- destport = ntohs(pTCPHead->DestPort);
- //strL4.Format(" sour port:%d,
- // dest port:%d", sourport, destport);
- strSourPort.Format("%d",sourport);
- strDestPort.Format("%d", destport);
- HdrLen = (pTCPHead->HLen)>>4; //事实上只有4位
- HdrLen *= 4;
- pdata = ((BYTE*)pTCPHead)+HdrLen;
- totallen -= HdrLen;
- break;
- }
- case IPPROTO_UDP:
- {
- pUDPHead=(struct UDPPacketHead *)(buf+HdrLen);
- sourport = ntohs(pUDPHead->SourPort);
- destport = ntohs(pUDPHead->DestPort);
- //strL4.Format(" sour port:%d,
- // dest port:%d", sourport, destport);
- strSourPort.Format("%d", sourport);
- strDestPort.Format("%d", destport);
- pdata = ((BYTE*)pUDPHead) + UDP_HEAD_LEN;
- totallen -= UDP_HEAD_LEN;
- break;
- }
- }
-
- if(pIpHeader->proto == IPPROTO_ICMP)
- strData.Format("type:%d code:%d data:%s",
- pICMPHead->Type, pICMPHead->Code, pdata);
- else strData.Format(" %s", pdata);
-
- strSize.Format("%d", totallen);
- pDlg->AddData(strProto, szSource, strSourPort,
- szDest, strDestPort, strSize, strData);
-
- if(iLen < iRet)
- {
- iRet -= iLen;
- bufwork += iLen;
- pIpHeader = (IPHEADER*)bufwork;
- }
- else
- break; // pIpHeader->total_len == iRet and go out
- }
- else
- { // read last part of buf. I wrote it, but always recv()
- // read exactly the length of the packet
- int iLast = iLen - iRet;
- pLastBuf = new char [iLen];
- int iReaden = iRet;
- memcpy(pLastBuf, bufwork, iReaden);
- iRet = recv(pDlg->m_s, pLastBuf + iReaden, iLast, 0);
- if(iRet == SOCKET_ERROR)
- {
- dwErr = WSAGetLastError();
- sprintf(szErr, "Error recv() = %ld ", dwErr);
- break;
- }
- else
- {
- bufwork = pLastBuf;
- pIpHeader = (IPHEADER*)bufwork;
- if(iRet == iLast)
- iRet = iLen;
- else
- { // read all last data
- iReaden += iRet;
- iLast -= iRet;
- while(TRUE)
- {
- iRet = recv(pDlg->m_s, pLastBuf+iReaden,
- iLast, 0);
- if(iRet == SOCKET_ERROR)
- {
- dwErr = WSAGetLastError();
- sprintf(szErr,
- "Error recv() = %ld ", dwErr);
- break;
- }
- else
- {
- iReaden += iRet;
- iLast -= iRet;
- if(iLast <= 0)
- break;
- }