免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2151 | 回复: 7
打印 上一主题 下一主题

请好心人贴个显示Tcp/ip 报文头的 c 程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-10-27 20:05 |只看该作者 |倒序浏览
写了一个client 和server程序,
server 端想把client 端发来的数据包(tcp报文头)
打印出来看看

环境:  Sco Unix5.05 ( Red Hat9) 下

论坛徽章:
0
2 [报告]
发表于 2005-10-27 20:23 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序


  1.   /* 传输层Tcp方式的信息 */
  2.   unsigned char * Tcp_Head;                  //tcp数据包指针
  3.   unsigned int    Tcp_Total_Len;             //总长度
  4.   unsigned int    Tcp_Src_Port;              //源端口
  5.   unsigned int    Tcp_Tag_Port;              //目标端口
  6.   unsigned long   Tcp_Id;                    //序号
  7.   unsigned long   Tcp_Confirm_Id;            //确认序号
  8.   unsigned char   Tcp_Head_Len;              //头长度
  9.   unsigned char   Tcp_Reserved_6Bit;         //未用
  10.   unsigned char   Tcp_Flag;                  //标志
  11.   unsigned int    Tcp_Screen_Size;           //窗口尺寸
  12.   unsigned int    Tcp_Sum;                   //检校和
  13.   unsigned int    Tcp_Urgent_Ptr;            //紧急指针
  14.   unsigned int    Tcp_Option_Len;            //选项长度
  15.   unsigned char   Tcp_Option[0x0f*4-20+1];   //选项内容
  16.   unsigned int    Tcp_Data_Len;              //tcp内容长度
  17.   unsigned char * Tcp_Data;                  //tcp内容指针

  18. /*
  19. 函数功能:tcp解包
  20. 传入参数:
  21.   data: 数据流
  22.   len:  长度
  23. 返回参数:
  24.   成功:1
  25.   失败:0
  26. */
  27. int TNetProt::Unpack_Ip_Tcp(const unsigned char * data,int len)
  28. {
  29. int id;
  30. const unsigned char * pos=data;

  31.   if(len<20) return 0;
  32.   mPack.Tcp_Head=(unsigned char *)data;
  33.   /* 源端口号 16bit */
  34.   mPack.Tcp_Src_Port = *pos++;
  35.   mPack.Tcp_Src_Port<<=8;
  36.   mPack.Tcp_Src_Port |= *pos++;
  37.   /* 目标端口号 16bit */
  38.   mPack.Tcp_Tag_Port = *pos++;
  39.   mPack.Tcp_Tag_Port<<=8;
  40.   mPack.Tcp_Tag_Port |= *pos++;
  41.   /* 序号 32bit */
  42.   mPack.Tcp_Id=*pos++;
  43.   mPack.Tcp_Id<<=8;
  44.   mPack.Tcp_Id|=*pos++;
  45.   mPack.Tcp_Id<<=8;
  46.   mPack.Tcp_Id|=*pos++;
  47.   mPack.Tcp_Id<<=8;
  48.   mPack.Tcp_Id|=*pos++;
  49.   /* 确认序号 32bit */
  50.   mPack.Tcp_Confirm_Id=*pos++;
  51.   mPack.Tcp_Confirm_Id<<=8;
  52.   mPack.Tcp_Confirm_Id|=*pos++;
  53.   mPack.Tcp_Confirm_Id<<=8;
  54.   mPack.Tcp_Confirm_Id|=*pos++;
  55.   mPack.Tcp_Confirm_Id<<=8;
  56.   mPack.Tcp_Confirm_Id|=*pos++;
  57.   /* 首部长度 4bit 实际上是指32bit的个数,因此转换为字节数要乘4*/
  58.   mPack.Tcp_Head_Len=(unsigned char)((*pos++)&0xf0);
  59.   mPack.Tcp_Head_Len>;>;=4;
  60.   mPack.Tcp_Head_Len=(unsigned char)(mPack.Tcp_Head_Len*4);
  61.   /* 6bit保留,不做任何处理 */
  62.   mPack.Tcp_Reserved_6Bit = 0;
  63.   /* 下面是6个标志位 */
  64.   mPack.Tcp_Flag=(unsigned char)((*pos)&0x3f);
  65.   pos++;
  66.   /* 窗口大小 16bit */
  67.   mPack.Tcp_Screen_Size = *pos++;
  68.   mPack.Tcp_Screen_Size<<=8;
  69.   mPack.Tcp_Screen_Size |= *pos++;
  70.   /* Tcp 检验和 16bit */
  71.   mPack.Tcp_Sum = *pos++;
  72.   mPack.Tcp_Sum<<=8;
  73.   mPack.Tcp_Sum |= *pos++;
  74.   /* 紧急指针 16bit */
  75.   mPack.Tcp_Urgent_Ptr = *pos++;
  76.   mPack.Tcp_Urgent_Ptr<<=8;
  77.   mPack.Tcp_Urgent_Ptr |= *pos++;
  78.   /* 选项 Tcp_Head_Len - 20*/
  79.         mPack.Tcp_Option_Len = mPack.Tcp_Head_Len - 20;
  80.   if(mPack.Tcp_Option_Len>;40) return 0;
  81.   for(id=0;id<(int)mPack.Tcp_Option_Len;id++)
  82.     mPack.Tcp_Option[id]=*pos++;
  83.   mPack.Tcp_Option[id]=0;
  84.   mPack.Tcp_Data_Len=(int)(mPack.Ip_Data_Len - mPack.Tcp_Head_Len);
  85.   /* Tcp的数据指针 */
  86.   mPack.Tcp_Data =(unsigned char *) pos;

  87.   mPack.Tcp_Total_Len=mPack.Tcp_Head_Len+mPack.Tcp_Data_Len;
  88.   return 1;
  89. };
复制代码

论坛徽章:
0
3 [报告]
发表于 2005-10-28 08:17 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序

应用程序如何才能得到tcp的报头?

论坛徽章:
0
4 [报告]
发表于 2005-10-28 08:22 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序

应用程序如何才能得到tcp的报头?



原始套接口通信

论坛徽章:
0
5 [报告]
发表于 2005-10-28 12:25 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序

原始套接口通信


原始套接口不是工作在IP层吗?怎么能出来一个TCP报头

论坛徽章:
0
6 [报告]
发表于 2005-10-28 13:28 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序

原始套接口:
IP + TCP 或
IP + UDP 或
IP + ICMP

论坛徽章:
0
7 [报告]
发表于 2005-10-28 15:22 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序

原始套接口:
IP + TCP 或
IP + UDP 或
IP + ICMP


还是不太明白,是自己实现TCP吗?

论坛徽章:
0
8 [报告]
发表于 2005-10-28 19:05 |只看该作者

请好心人贴个显示Tcp/ip 报文头的 c 程序

谢谢 mengwg    老大  
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP