CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
山寨机中的战斗机! 程序优化工程师到底对IT界有没有贡献
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  专题开发/技术/项目 >  网络通信

再谈网络监听!!!

楼主lf()2000-03-08 19:55:00 在 专题开发/技术/项目 / 网络通信 提问

 
  在linux环境下,可通过BSD套接口编程,设置混杂模式,实现IP包的监听:  
  如以下程序:  
  但在WinNT环境下,WinSock2接口函数似乎没有提供对数据链路层的访问,  
  是否WinSock编程能实现对网络上IP包的监听?  
  如何实现?  
  请提供代码,如有Windows环境下的sniffer的源代码  
  Thanks!!!  
   
   
  /*   ipl.c   1/3/95           by   loq   */  
  /*   monitors   ip   packets   for   Linux   */  
  #include   <sys/types.h>  
  #include   <sys/socket.h>  
  #include   <sys/time.h>  
  #include   <netinet/in.h>  
  #include   <linux/if.h>  
  #include   <signal.h>  
  #include   <stdio.h>  
  #include   <linux/socket.h>  
  #include   <linux/ip.h>  
  #include   <linux/tcp.h>  
  #include   <linux/if_ether.h>  
   
  #define   BUFLEN   8192  
  #define   ETHLINKHDR   14  
   
   
  print_data(int   count,   char   *buff)  
  {  
                  int   i,j,c;  
                  int   printnext=1;  
                  if(count)  
                  {  
                  if(count%16)  
                                  c=count+(16-count%16);  
                  else   c=count;  
                  }  
                                  else  
                                  c=count;  
                  for(i=0;i<c;i++)  
                  {  
                                  if(printnext)   {   printnext--;   printf("%.4x   ",i&0xffff);   }  
                                  if(i<count)  
                                  printf("%3.2x",buff[i]&0xff);  
                                  else  
                                  printf("       ");  
                                  if(!((i+1)%8))  
                                                  if((i+1)%16)  
                                                                  printf("   -");  
                                                  else  
                                                                  {  
                                                                                  printf("       ");  
                                                                                  for(j=i-15;j<=i;j++)  
                                                                                      if(j<count)   {  
                                                                                                  if(   (buff[j]&0xff)   >=   0x20   &&  
                                                                                                          (buff[j]&0xff)<=0x7e)  
                                                                                                              printf("%c",buff[j]&0xff)  
  ;  
                                                                                                  else   printf(".");  
                                                                                                  }   else   printf("   ");  
                                                                  printf("\n");   printnext=1;  
                                                                  }  
                  }  
  }  
   
  int  
  initdevice(device,   pflag)  
                  char   *device;  
                  int   pflag;  
  {  
  #define   PROTO   htons(0x0800)       /*   Ethernet   code   for   IP   protocol   */  
   
                  int   if_fd=0;  
                  struct   ifreq   ifr;  
   
                  if   (   (if_fd=socket(AF_INET,SOCK_PACKET,PROTO))   <   0   )   {  
                                  perror("Can't   get   socket");  
                                  exit(2);  
                  }  
   
                  strcpy(ifr.ifr_name,   device);               /*   interface   we're   gonna   use   */  
                  if(   ioctl(if_fd,   SIOCGIFFLAGS,   &ifr)   <   0   )   {         /*   get   flags   */  
                                  close(if_fd);  
                                  perror("Can't   get   flags");  
                                  exit(2);  
                  }  
  #if   1  
                  if   (   pflag   )  
                                  ifr.ifr_flags     and   =   IFF_PROMISC;                   /*   set   promiscuous   mode   *  
  /  
                  else  
                                  ifr.ifr_flags   &=   ~(IFF_PROMISC);  
  #endif  
   
                  if(   ioctl(if_fd,   SIOCSIFFLAGS,   &ifr)   <   0   )   {         /*   set   flags   */  
                                  close(if_fd);  
                                  perror("Can't   set   flags");  
                                  exit(2);  
                  }  
                  return   if_fd;  
  }  
   
  struct   etherpacket   {  
                  struct   ethhdr                       eth;  
                  struct   iphdr                         ip;  
                  struct   tcphdr                       tcp;  
                  char                                         data[8192];  
                  };  
   
  main()  
  {  
                  int   linktype;  
                  int   if_eth_fd=initdevice("eth0",1);  
  #if   0  
                  int   if_ppp_fd=initdevice("sl0",1);  
  #endif  
                  struct   etherpacket   ep;  
                  struct   sockaddr   dest;  
                  struct   iphdr   *ip;  
                  struct   tcphdr   *tcp;  
                  struct   timeval   timeout;  
                  fd_set   rd,wr;  
                  int   dlen;  
  #if   0  
                  struct   slcompress   *slc=slhc_init(64,64);  
  #endif  
   
                  for(;;)  
                  {  
                                  bzero(&dest,sizeof(dest));  
                                  dlen=0;  
                                  FD_ZERO(&rd);  
                                  FD_ZERO(&wr);  
                                  FD_SET(if_eth_fd,&rd);  
  #if   0  
                                  FD_SET(if_ppp_fd,&rd);  
  #endif  
                                  timeout.tv_sec=0;  
                                  timeout.tv_usec=0;  
                                  ip=(struct   iphdr   *)(((unsigned   long)&ep.ip)-2);  
                                  tcp=(struct   tcphdr   *)(((unsigned   long)&ep.tcp)-2);  
                                  while(timeout.tv_sec==0   &&   timeout.tv_usec==0)  
                                  {  
                                  timeout.tv_sec=10;  
                                  timeout.tv_usec=0;  
                                  select(20,&rd,&wr,NULL,&timeout);  
                                  if(FD_ISSET(if_eth_fd,&rd))  
                                                  {  
                                                  printf("eth\n");  
                                                  recvfrom(if_eth_fd,&ep,sizeof(ep),0,&dest,&dlen);  
                                                  }  
  #if   0  
                                  else  
                                                  if(FD_ISSET(if_ppp_fd,&rd))  
                                                  {  
                                                  recvfrom(if_ppp_fd,&ep,sizeof(ep),0,&dest,&dlen);  
                                                  printf("ppp\n");  
                                                  }  
  #endif  
                                  }  
   
                                  printf("proto:   %.4x",ntohs(ep.eth.h_proto));  
  #if   0  
                                  if(ep.eth.h_proto==ntohs(8053))  
                                  {  
                                                  slhc_uncompress(slc,&ep,sizeof(ep));  
                                  }  
  #endif  
   
                                  if(ep.eth.h_proto==ntohs(ETH_P_IP))  
                                  {  
                                  printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x->",  
                                                  ep.eth.h_source[0],ep.eth.h_source[1],  
                                                  ep.eth.h_source[2],ep.eth.h_source[3],  
                                                  ep.eth.h_source[4],ep.eth.h_source[5]);  
                                  printf("%.2x:%.2x:%.2x:%.2x:%.2x:%.2x   ",  
                                                  ep.eth.h_dest[0],ep.eth.h_dest[1],  
                                                  ep.eth.h_dest[2],ep.eth.h_dest[3],  
                                                  ep.eth.h_dest[4],ep.eth.h_dest[5]);  
                                  printf("%s[%d]->",inet_ntoa(ip->saddr),ntohs(tcp->source));  
                                  printf("%s[%d]\n",inet_ntoa(ip->daddr),ntohs(tcp->dest));  
                                  print_data(htons(ip->tot_len)-sizeof(ep.ip)-sizeof(ep.tcp),  
                                                  ep.data-2);  
                                  }  
                  }  
  }  
   
   
  问题点数:60、回复次数:12Top

1 楼shuke()回复于 2000-03-09 18:50:00 得分 60

给你的邮件中有更改网卡工作模式的接口,自己看吧。Top

2 楼zhongzhong76()回复于 2000-03-26 22:04:00 得分 0

SHUKE,我也要一份好吗?  
  zhongzhong76@sina.comTop

3 楼zhangwwww(zhangwenq)回复于 2000-05-21 02:19:00 得分 0

shuke:  
  我也想要一份?  
  zhang09650180@sina.comTop

4 楼xingxing3(猩猩)回复于 2000-05-30 17:02:00 得分 0

  给我一份好吗?  
  xingxing3@263.netTop

5 楼czb(草中宝)回复于 2000-06-11 06:08:00 得分 0

shuke:  
        你好,我想你也不会差我一份吧。  
        请寄BBN@21CN.COMTop

6 楼lzq()回复于 2000-08-14 22:20:00 得分 0

给我一份好吗?  
  sz_lzq@163.netTop

7 楼newyearday(葡绨老祖)回复于 2000-11-13 22:47:00 得分 0

给我~~NEWYEARDAY@YEAH.NETTop

8 楼jodooo(蓝泥巴)回复于 2000-12-05 22:23:00 得分 0

给我一份好吗?  
  jodooo@163.netTop

9 楼sean(sunbow)回复于 2000-12-06 10:18:00 得分 0

可以给我一份吗?  
  sunbow@email.com.cnTop

10 楼dutsf(阿石)回复于 2000-12-18 12:16:00 得分 0

shuke大虾,给我一份好吗?  
  谢谢!  
  祝你圣诞快乐! Top

11 楼dutsf(阿石)回复于 2000-12-18 12:21:00 得分 0

忘说信箱了:dutsf@263.netTop

12 楼dirst(lucky)回复于 2001-02-08 14:25:00 得分 0

以给我一份吧,dirst@citiz.netTop

相关问题

  • 网络监听
  • 关于网络监听
  • oracle 的网络监听问题
  • 监听网络端口读异常
  • 如何做网络监听器(监听是否有人扫描自己PORT)?
  • 怎么监听收到的网络数据包?
  • 如何在win2k上做一个网络监听程序?
  • 请教:如何用vb实现网络数据包监听
  • 请问如何用vc做网络监听软件?
  • 请问怎么写网络监听软件?

关键词

  • .net
  • 监听
  • 接口
  • source
  • tcp
  • ip
  • ep
  • eth
  • dest
  • count

得分解答快速导航

  • 帖主:lf
  • shuke

相关链接

  • CSDN Blog
  • 技术文档
  • 代码下载
  • 第二书店
  • 读书频道

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo