Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1489621
  • 博文数量: 408
  • 博客积分: 10036
  • 博客等级: 上将
  • 技术积分: 4440
  • 用 户 组: 普通用户
  • 注册时间: 2006-04-06 13:57
文章分类

全部博文(408)

文章存档

2011年(1)

2010年(2)

2009年(1)

2008年(3)

2007年(7)

2006年(394)

我的朋友

分类: C/C++

2006-07-03 17:25:25

 
Web me09.cublog.cn
搜索更多
给出一个 netdump 程序, 抓包用的.
[ 作者:佚名 | 转贴自:本站原创 | 点击数:262 | 更新时间:2005-4-26 | 文章录入: ]

最基本的,在linux i386上
代码:


//netdump.c 

#include    
#include
#include
#include  
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include
#include

void die(char *why, int n)
{
  perror(why);
  exit(n);
}


int do_promisc(char *nif, int sock )
{
struct ifreq ifr;
 
  strncpy(ifr.ifr_name, nif,strlen(nif)+1);
  if((ioctl(sock, SIOCGIFFLAGS, &ifr) == -1)) {       
    die("ioctl", 2);
  }
  ifr.ifr_flags |= IFF_PROMISC;
  if(ioctl(sock, SIOCSIFFLAGS, &ifr) == -1 ) {
    die("ioctl", 3);
  }
}

char buf[2*32767];

main()
{
struct sockaddr_in addr;
struct iphdr *ip;
struct tcphdr *tcp;
int sock, r, len;
char *data;
char ss[32], dd[32];

  if((sock = socket(AF_INET,SOCK_RAW,IPPROTO_TCP)) == -1) die("socket", 1);
  do_promisc("eth0", sock);
 
  for(;;) {
    len = sizeof(addr);
    r = recvfrom(sock,(char *)buf,sizeof(buf),0,(struct sockaddr *)&addr,&len);
    buf[r] = 0;
    ip = (struct iphdr *)buf;
    tcp = (struct tcphdr *)(buf + sizeof(struct iphdr));

    printf("PktSize: %d IPLEN %d PROT %d  %s:%d-->%s:%d %d \n",
   r, ip->tot_len,
   ip->protocol,
   strcpy(ss, inet_ntoa(*(struct in_addr*)&(ip->saddr))),
   ntohs(tcp->source),
   strcpy(dd, inet_ntoa(*(struct in_addr*)&(ip->daddr))),
   ntohs(tcp->dest),
   tcp->doff
   );
    data = (char*)tcp + 4*tcp->doff;
    printf("data = %s\n", data);
  }

}

阅读(755) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~