崔5220 2015-05-28 01:17 采纳率: 0%
浏览 1151

winpcap嗅探器中IP头初始化问题

在下边的代码中我知道它们分别代表IP数据包的什么字段,但是它们的具体格式我还是不太清楚。本人菜鸟,求大神指教啊。
1.m_nVersion=*pos/16;

m_nHeaderLength = *pos%16; //这里的“/”和“%”是什么含义?
2.m_nPrecedence=(*pos & 16)*4+(*pos & 8)*2+(*pos & 4);
//这里的“*4”是指指针向有移动2位吗?

CIPPacket::CIPPacket(const unsigned char buf,int buflen)
{
unsigned char *pos;
pos=(unsigned char *)buf;

m_nVersion=*pos/16;

m_nHeaderLength = *pos%16;

pos++;
m_nServiceType=*pos;

m_nPrecedence=(*pos & 16)*4+(*pos & 8)*2+(*pos & 4);

if(*pos & 16)
m_bDelay = true;

else
m_bDelay = false;
if(*pos & 8)
m_bThroughtPut = true;

else
m_bThroughtPut = false;
if(*pos & 4)
m_bReliability = true;

else
m_bReliability = false;
pos++;
m_uTotalLength=(*pos)*256+(
(pos+1));

pos+=2;
m_nIdentification=(*pos)*256+(*(pos+1));

pos+=2;
if(*pos & 64)
m_bDF=true;
else
m_bDF=false;
if(*pos & 32)
m_bMF=true;
else
m_bMF=false;
m_nFragOffSet=(*pos%32)*256+(*(pos+1));

pos+=2;
m_nTTL = pos;

pos++;
m_nProtocol = *pos;

pos++;
m_nCheckSum = (*pos)*256+(
(pos+1));

pos+=2;
m_lSrcIP = (*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));

pos+=4;
m_lDestIP = (*pos)*0x1000000+(*(pos+1))*0x10000+(*(pos+2))*0x100+(*(pos+3));
if(m_nHeaderLength > 5)

{
pos += 4;

m_nOptLength=(m_nHeaderLength-5)*4;

m_pOptions=new unsigned char[m_nOptLength];

memcpy(m_pOptions,buf+20,m_nOptLength);

}
else
{
m_nOptLength = 0;
m_pOptions = NULL;

}
pos=(unsigned char *)(buf+m_nHeaderLength*4);

m_nDataLength = m_uTotalLength-m_nHeaderLength*4;
if(m_nDataLength > 0)

{
m_pData=new unsigned char[m_nDataLength];

memcpy(m_pData,buf+m_nHeaderLength*4,m_nDataLength);
}
else
m_pData = NULL;

  • 写回答

2条回答 默认 最新

  • nswcfd 2015-05-28 02:32
    关注

    ip hdr的第一个字节是version和ip_header_length的混合编码,通常值是0x45,4表示版本4(ipv4),5表示头部长度是20(5*4=20)。
    所以代码中/16和%16分别是用来取version和header_length的,写成((*buf)&0xf0)>>4和(*buf)&0f更好理解一些。

    其它字段,去网上搜一个Ip头部的定义就都清楚了。

    评论

报告相同问题?

悬赏问题

  • ¥15 seatunnel-web使用SQL组件时候后台报错,无法找到表格
  • ¥15 fpga自动售货机数码管(相关搜索:数字时钟)
  • ¥15 用前端向数据库插入数据,通过debug发现数据能走到后端,但是放行之后就会提示错误
  • ¥30 3天&7天&&15天&销量如何统计同一行
  • ¥30 帮我写一段可以读取LD2450数据并计算距离的Arduino代码
  • ¥15 飞机曲面部件如机翼,壁板等具体的孔位模型
  • ¥15 vs2019中数据导出问题
  • ¥20 云服务Linux系统TCP-MSS值修改?
  • ¥20 关于#单片机#的问题:项目:使用模拟iic与ov2640通讯环境:F407问题:读取的ID号总是0xff,自己调了调发现在读从机数据时,SDA线上并未有信号变化(语言-c语言)
  • ¥20 怎么在stm32门禁成品上增加查询记录功能