- 论坛徽章:
- 0
|
请好心人贴个显示Tcp/ip 报文头的 c 程序
- /* 传输层Tcp方式的信息 */
- unsigned char * Tcp_Head; //tcp数据包指针
- unsigned int Tcp_Total_Len; //总长度
- unsigned int Tcp_Src_Port; //源端口
- unsigned int Tcp_Tag_Port; //目标端口
- unsigned long Tcp_Id; //序号
- unsigned long Tcp_Confirm_Id; //确认序号
- unsigned char Tcp_Head_Len; //头长度
- unsigned char Tcp_Reserved_6Bit; //未用
- unsigned char Tcp_Flag; //标志
- unsigned int Tcp_Screen_Size; //窗口尺寸
- unsigned int Tcp_Sum; //检校和
- unsigned int Tcp_Urgent_Ptr; //紧急指针
- unsigned int Tcp_Option_Len; //选项长度
- unsigned char Tcp_Option[0x0f*4-20+1]; //选项内容
- unsigned int Tcp_Data_Len; //tcp内容长度
- unsigned char * Tcp_Data; //tcp内容指针
- /*
- 函数功能:tcp解包
- 传入参数:
- data: 数据流
- len: 长度
- 返回参数:
- 成功:1
- 失败:0
- */
- int TNetProt::Unpack_Ip_Tcp(const unsigned char * data,int len)
- {
- int id;
- const unsigned char * pos=data;
- if(len<20) return 0;
- mPack.Tcp_Head=(unsigned char *)data;
- /* 源端口号 16bit */
- mPack.Tcp_Src_Port = *pos++;
- mPack.Tcp_Src_Port<<=8;
- mPack.Tcp_Src_Port |= *pos++;
- /* 目标端口号 16bit */
- mPack.Tcp_Tag_Port = *pos++;
- mPack.Tcp_Tag_Port<<=8;
- mPack.Tcp_Tag_Port |= *pos++;
- /* 序号 32bit */
- mPack.Tcp_Id=*pos++;
- mPack.Tcp_Id<<=8;
- mPack.Tcp_Id|=*pos++;
- mPack.Tcp_Id<<=8;
- mPack.Tcp_Id|=*pos++;
- mPack.Tcp_Id<<=8;
- mPack.Tcp_Id|=*pos++;
- /* 确认序号 32bit */
- mPack.Tcp_Confirm_Id=*pos++;
- mPack.Tcp_Confirm_Id<<=8;
- mPack.Tcp_Confirm_Id|=*pos++;
- mPack.Tcp_Confirm_Id<<=8;
- mPack.Tcp_Confirm_Id|=*pos++;
- mPack.Tcp_Confirm_Id<<=8;
- mPack.Tcp_Confirm_Id|=*pos++;
- /* 首部长度 4bit 实际上是指32bit的个数,因此转换为字节数要乘4*/
- mPack.Tcp_Head_Len=(unsigned char)((*pos++)&0xf0);
- mPack.Tcp_Head_Len>;>;=4;
- mPack.Tcp_Head_Len=(unsigned char)(mPack.Tcp_Head_Len*4);
- /* 6bit保留,不做任何处理 */
- mPack.Tcp_Reserved_6Bit = 0;
- /* 下面是6个标志位 */
- mPack.Tcp_Flag=(unsigned char)((*pos)&0x3f);
- pos++;
- /* 窗口大小 16bit */
- mPack.Tcp_Screen_Size = *pos++;
- mPack.Tcp_Screen_Size<<=8;
- mPack.Tcp_Screen_Size |= *pos++;
- /* Tcp 检验和 16bit */
- mPack.Tcp_Sum = *pos++;
- mPack.Tcp_Sum<<=8;
- mPack.Tcp_Sum |= *pos++;
- /* 紧急指针 16bit */
- mPack.Tcp_Urgent_Ptr = *pos++;
- mPack.Tcp_Urgent_Ptr<<=8;
- mPack.Tcp_Urgent_Ptr |= *pos++;
- /* 选项 Tcp_Head_Len - 20*/
- mPack.Tcp_Option_Len = mPack.Tcp_Head_Len - 20;
- if(mPack.Tcp_Option_Len>;40) return 0;
- for(id=0;id<(int)mPack.Tcp_Option_Len;id++)
- mPack.Tcp_Option[id]=*pos++;
- mPack.Tcp_Option[id]=0;
- mPack.Tcp_Data_Len=(int)(mPack.Ip_Data_Len - mPack.Tcp_Head_Len);
- /* Tcp的数据指针 */
- mPack.Tcp_Data =(unsigned char *) pos;
- mPack.Tcp_Total_Len=mPack.Tcp_Head_Len+mPack.Tcp_Data_Len;
- return 1;
- };
复制代码 |
|