当前位置:  技术问答>linux和unix

我怎么才能读出截到的IP包的数据(用16进制)?

    来源: 互联网  发布时间:2015-10-16

    本文导语:  我用原始套界字抓到了IP层的包,然后分析TCP或UDP头,再移动指针到数据的位置,用16进制读出来,怎么读出来全是0呢?没读到? 我感觉是不是我指针的位置移错了????? 我对UDP携带的数据的位置有点不清楚,...

我用原始套界字抓到了IP层的包,然后分析TCP或UDP头,再移动指针到数据的位置,用16进制读出来,怎么读出来全是0呢?没读到?
我感觉是不是我指针的位置移错了?????
我对UDP携带的数据的位置有点不清楚,还有,我用 u_int16_t的指针可以读出来吗?


 struct ip     *pip; 
 struct iphdr  *piph;
 struct udphdr *pudp; 
 u_int16_t     *data; //数据包数据指针
char buf[40960]; 
char *ptemp; 
r = recvfrom(sock,(char *)buf,sizeof(buf), 0, (struct sockaddr *)&addr,&len);  
ptemp = buf; 

if(ptype==ETHERTYPE_IP) //如果是IP数据包 
{
printf("IP packet!");
         ptemp += sizeof(struct ether_header); //指针后移eth头的长度 
pip  = (struct ip *)ptemp;  
         piph = (struct iphdr *)ptemp;         //piph指向ip层的头             
         ptemp += sizeof(struct ip);           //指针后移ip结构的长度
      //处理UDP数据包
      data=(u_char *)(pip + sizeof(struct iphdr) + 8);

      if(piph->protocol==IPPROTO_UDP)   //如果是UDP
      { 
pudp = (struct udphdr *)ptemp;      //ptcp指向udp头部    
                  for(i=0; i len)-8) ; ++i)
                  {                   
                      printf("%x ", data[i]);
                      if (i%20==19)
                printf("n");
                  } 
                   printf("n");
          break;
       }  
}

|
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 


void print_info(struct iphdr *iph, uint16_t sport, uint16_t dport) 
{
char sbuf[INET_ADDRSTRLEN];
char dbuf[INET_ADDRSTRLEN];
if (inet_ntop(AF_INET, &iph->saddr, sbuf, sizeof(sbuf)) && 
inet_ntop(AF_INET, &iph->daddr, dbuf, sizeof(dbuf)))
printf("%s:%u -> %s:%un", sbuf, sport, dbuf, dport);
}

static unsigned char buffer[1600];

int main(void)
{
int fd, len;
struct sockaddr_ll addr;
memset(&addr, 0, sizeof(addr));
addr.sll_family = AF_PACKET;
addr.sll_ifindex = 1;
if((fd = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))) 

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 请问:ORACLE中的数据取出来后,需不需要进行一定的转换才能变为C语言的数据类型啊?
  • 怎么样才能更新一行数据而不是一列数据?
  • mpeg2格式的数据流,封装成什么文件格式dvd影碟机才能播放
  • sqlserver iis7站长之家
  • 重定向怎样才能不覆盖掉原来的数据?
  • 用户程序怎样才能得到网卡的收发数据流量?
  • MySql是不是只能用命令行才能建数据表?
  • 怎么才能让键盘输入的数据不显示在屏幕上
  • 如何设置才能远程登录Mysql数据库
  • 请问我怎么样才能知道一个特定的数据库中是否存在某一个表
  • 如何才能直接从内网的主机传输数据?
  • 8139网卡驱动问题:如何才能让数据包立即发送
  • 公司要给客户做报表,从数据库返回数据,他们死活要返回的格式为Excel格式,请问我怎样才能把数据库返回的数据存为Excel的格式?
  • 使用jsp制作大型网站(访问量),究竟怎样才能最好的控制数据库的连接数?55分必给!
  • 怎么样才能不通过jdbc-odbc直接连到数据库,以sql7为例。
  • linux怎么样才能往ntfs分区上写数据。。。
  • 如何才能连上数据库(MySQL)
  • oracle的客户端要装些什么软件,才能访问到远程数据库,我急死了!!!
  • 做一个server端怎么办才能收发数据
  • 在我的java程序中,我从数据库中得到一批数据,不能确定是多少个,我要把它保存到我的java数组中,可是怎样才能向C++中的数组一样可以自由分配空间,在java中我必需预先指定大小,不会一定要用java中的那个可改变数组大小的类吧?
  • 半路出家转行学编程如何才能成为大牛?
  • 修改了hosts.allow,怎么才能生效,是启动了哪个服务才能生效吗?
  • 请较:用window2000做网关,现在LINUX怎么设置才能才能通过它上网呢?
  • 在applet中怎么才能得到当前页面的接口,我的意思是说怎样才能改变比如说一个输入框中的内容
  • 请问xvfs是什么文件系统?怎样才能让linux认出?
  • 如何才能再次进入linux?
  • 提示文字怎样才能按多行显示?
  • 如何才能在java(vj环境下)播放声音?
  • 急!怎样才能获得javax.rmi包?
  • 用什么软件才能打开后缀为.z的文件?
  • 为什么Component的组件要add后才能paint()?


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3