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

linux下面的原始套接字编程问题

    来源: 互联网  发布时间:2016-09-04

    本文导语:    如何侦听来源于指定 IP 地址的数据包,还有就是根据指定的协议类型来过虑包。   书上面说可以通过connect来设定,搞咯半天还是没成功阿,望大家指点一下。 | 这个可以用抓包实现的...

  如何侦听来源于指定 IP 地址的数据包,还有就是根据指定的协议类型来过虑包。
  书上面说可以通过connect来设定,搞咯半天还是没成功阿,望大家指点一下。

|
这个可以用抓包实现的么

老早以前的了,希望对你有帮助

/*author  :Logic0
  time    :2009-1-7
  OS      :UBUNTU 9.04
  compiler:GCC 4.3.3
  compile :gcc -o sniffer sniffer.c -lpcap
  run     :as root
*/

#include 
#include 
#include                            /*use libpcap lib*/
#include 
#include 
#include 
#include 
#include 
#include 
#include 

#define MAX_LEN_2_SNAP 2048                 /*maxlen of packets to grab*/           

/*
 *define arp flags
 */
#define ARP_REQUEST 1
#define ARP_REPLY 2

/*
 *define libpcap error code
 */
#define ERROR_RET -1
#define ERROR_GET NULL

#define PROMISC_MODE 1
#define WAIT_TIME 0

typedef struct my_arphdr
{
u_int16_t ar_hrd; /* format of hardware address */
u_int16_t     ar_pro; /* format of protocol address */
unsigned char ar_hln; /* length of hardware address */
unsigned char ar_pln; /* length of protocol address */
    u_int16_t ar_op; /* ARP opcode (command) */
unsigned char ar_sha[6];     /* sender hardware address */
unsigned char ar_sip[4]; /* sender IP address */
unsigned char ar_tha[6];     /* target hardware address */
unsigned char ar_tip[4]; /* target IP address */
}ARPHDR_T;

struct bpf_program filter;             /*packet filter*/
struct pcap_pkthdr pkthdr;             /*libpcap header*/
struct in_addr addr;

bpf_u_int32 netp,maskp;

struct ethhdr *my_ethhdr;                  /*ethernet packet header*/
struct tcphdr *my_tcphdr;                  /*tcp packet header*/
struct iphdr  *my_iphdr;                   /*ip packet header*/
ARPHDR_T      *my_arphdr;                  /*arp packet header*/

void construct_filter(struct bpf_program *filter);
int get_dtl(pcap_t * , char *);
int get_ip_packets(pcap_t * , char *);
int get_tcp_packets(pcap_t * , char *);
int get_arp_packets(pcap_t * , char *);
void get_cnt(int *p);                       /*user input the number of packets to grab*/

int main()
{
     int ret = 0;                           /*return value for error check*/
     pcap_t *descr;
     char *device,errbuf[PCAP_ERRBUF_SIZE]; /*network device  and  error buf*/
     int choice = 0;

     /*
      *       menu          
      */
     fprintf(stdout,"0.Type of my datalinkn");
     fprintf(stdout,"1.Grab and analyse all packetn");
     fprintf(stdout,"2.Grab and analyse IP packetn");
     fprintf(stdout,"3.Grab and analyse TCP packetn");
     fprintf(stdout,"4.Grab and analyse ARP packetn");
     fprintf(stdout,"YOUR CHOICE:");
     scanf("%d",&choice);

     /*
      *    get device       
      */
     device = pcap_lookupdev(errbuf);
     if(device == ERROR_GET)
     {
          fprintf(stdout,"device get error:%sn",errbuf);
          exit(1);
     }
     fprintf(stdout,"DEVICE :%sn",device);

     /* 
      *get and print net and netmask 
      */
     ret = pcap_lookupnet(device , &netp , &maskp , errbuf);
     if(ret == ERROR_RET)
     {
          fprintf(stdout,"NET find error:%sn",errbuf);
          exit(1);
     }
     addr.s_addr = netp;
     fprintf(stdout,"NET    :%sn",inet_ntoa(addr));
     addr.s_addr = maskp;
     fprintf(stdout,"NETMASK:%sn",inet_ntoa(addr));

     /*
      *open the device 
      */
     descr = pcap_open_live(device , MAX_LEN_2_SNAP , PROMISC_MODE , WAIT_TIME , errbuf);
     if(descr == ERROR_GET)
     {
          fprintf(stdout,"open device link error:%sn",errbuf);
          exit(1);
     }
     
     /*
      *process user's choice 
      */
     while(1)
     { 
          switch(choice)
          {
               case 0:
                    get_dtl(descr,errbuf);
                    break;
               case 1:
                    get_all_packets(descr,errbuf);
                    break;
               case 2:
                    get_ip_packets(descr,errbuf);
                    break;
               case 3:
                    get_tcp_packets(descr,errbuf);
                    break;
               case 4:
                    get_arp_packets(descr,errbuf);
                    break;
               default:
                    fprintf(stdout,"input error!reinput:n");
          }
          fprintf(stdout,"Your choice:");
          scanf("%d",&choice);
     }
     
     return 0;
}

void get_cnt(int *cnt_p)
{
    fprintf(stdout,"input how many packets to grab:");
    scanf("%d",cnt_p);
    return;
}

int get_dtl(pcap_t *descr , char *err)
{
     int ret;
     ret = pcap_datalink(descr);
     
     /*
      * DLT_EN10MB ------> ETHERNET 10/100/1000MB
      * DLT_PPP_ENTHER---> PPPOE
      */
     if(ret == DLT_EN10MB)
     {
          fprintf(stdout,"DATALINK TYPE :Ethernet 10/100/1000MBn");
          return 1;
     }
     if(ret == DLT_PPP_ETHER)
     {
          fprintf(stdout,"DATALINK TYPE :PPPOEn");
          return 1;
     }
     fprintf(stdout,"DATALINK TYPE :OTHERn");
     return 0;
}

int get_ip_packets(pcap_t *descr , char *err)
{
     char *packet;
     int cnt = 0;
     
     get_cnt(&cnt);
     
     fprintf(stdout,"protocoltlengthtsrc_ipttdst_ipn");
     
     while(cnt--)
     {
          packet = pcap_next(descr , &pkthdr);
          my_iphdr = (struct iphdr *)(packet + sizeof(struct ethhdr));
          addr.s_addr = my_iphdr->saddr;
          fprintf(stdout,"IPtt%dt%st",ntohs(my_iphdr->tot_len) ,inet_ntoa(addr));
          addr.s_addr = my_iphdr->daddr;
          fprintf(stdout,"%sn",inet_ntoa(addr));
     }
     return 0;
}

int get_tcp_packets(pcap_t *descr , char *err)
{
     char *packet;
     int cnt = 0 ;

     get_cnt(&cnt);
     
     fprintf(stdout,"protocoltwindowtSEQtack_seqn");
     while(cnt--)
     {
          packet = pcap_next(descr , &pkthdr);
          my_tcphdr = (struct tcphdr *)(packet + sizeof(struct ethhdr)+sizeof(struct iphdr));
          fprintf(stdout,"TCPtt%dt%dt%dn",ntohs(my_tcphdr->window) ,ntohs( my_tcphdr->seq) ,ntohs( my_tcphdr->ack_seq));
     }
     return 0;
}

int get_arp_packets(pcap_t *descr , char *err)
{
     char *packet;
     int cnt = 0;
     int i = 0;                 /*for temp use*/
     
     get_cnt(&cnt);
     
     fprintf(stdout,"protocoltkindtsender_macttarget_macn");

     pcap_compile(descr , &filter , "arp" , 1 , maskp);
     pcap_setfilter(descr , &filter);
     
     while(cnt--)
     {
          packet = pcap_next(descr , &pkthdr);
          my_arphdr = (struct arphdr *)(packet + 14);
          fprintf(stdout,"ARPtt%st",ntohs(my_arphdr->ar_op)==ARP_REQUEST?"Request":"Reply");
          for(i = 0 ; i ar_sha[i]));
          }
          fprintf(stdout,"t");
          for(i = 0 ; i ar_tha[i]));
          }
          fprintf(stdout,"n");
     }
     pcap_compile(descr , &filter , "", 1 , maskp);
     pcap_setfilter(descr , &filter);
     
     return 0;
}

int get_all_packets(pcap_t *descr , char *err)
{
     char *packet;
     int cnt = 0;
     struct ether_header *my_eth;
     
     get_cnt(&cnt);
     
     fprintf(stdout,"protocoltlengthtsrc_ipttdst_ipn");
 
     while(cnt--)
     {
          packet = pcap_next(descr , &pkthdr);
          my_eth = (struct ethhdr *)packet;
          switch(ntohs(my_eth->ether_type))
          {
               case ETHERTYPE_IP:
                    fprintf(stdout,"IPV4tt");
                    break;
               case ETHERTYPE_ARP:
                    fprintf(stdout,"ARPtt");
                    break;
               case ETHERTYPE_REVARP:
                    fprintf(stdout,"RARPtt");
                    break;
               case ETHERTYPE_IPV6:
                    fprintf(stdout,"IPV6tt");
                    break;
               default:
                    fprintf(stdout,"OTHERtt");
          }
          fprintf(stdout,"%dt",pkthdr.len);
          my_iphdr = (struct iphdr *)(packet + sizeof(struct ethhdr));
          addr.s_addr = my_iphdr->saddr;
          fprintf(stdout,"%st",inet_ntoa(addr));
          addr.s_addr = my_iphdr->daddr;
          fprintf(stdout,"%sn",inet_ntoa(addr)); 
     }
     return 0;
}

     

|
是说的 socket还是 raw socket? 印象中 raw socket是 数据报socket,而不是tcp socket,是不用connect的

    
 
 

您可能感兴趣的文章:

  • 关于linux套接字的问题
  • linux下原始套接字创建失败
  • Linux 套接字的问题
  • 大侠,求助!!LINUX下TCP套接字编程中客户端出现段错误
  • 请教高手:linux原始套接字问题
  • 请问linux下套接字读就绪产生什么信号
  • Linux下如何在普通用户下创建原始套接字(实现ping)
  • Linux9.0下最大套接字个数如何修改????(急)高分
  • 请问在Unix/Linux上的套接字模型有那些,那些比较常用,Apache使用的是那个,谢谢?!如果能和Windows上的作对比就更好了
  • linux 对 windows 的 套接字中文传输问题
  • 高分求高手赐教-关于linux下进程共享TCP套接字的问题
  • linux下原始套接字打印问题
  • linux网络套接字//accept参数为什么不用struct sockaddr结构体?
  • linux socket问题。。怎样获得已帮定特定port的一个套接字socket
  • 关于linux套接字缓冲区sk_buff的问题
  • 关于accept()函数能产生多少个套接字和在LINUX 能产生多少个线程
  • 【求助】套接字链接linux服务,显示connection refused
  •  
    本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
    本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • LINUX下面的WEB Service如果编写?是用.NET写吗?WINDOW下面的web service能在LINUX下面用吗?
  • 使用c gtk2 在linux 下,如何实现下面的问题,找了很久,没有这方面的资料
  • linux下面怎么用其它的文件下面的函数呀
  • linux下面的什么浏览器可以支持框架??许多网页没法正常观看!!!
  • 请教:linux下如何找到windows xp下面的文件
  • 怎样将linux下面的文件导入到windows下面?
  • 我以前是做windows下面的开发的,现在想转向Linux或者Unix开发
  • 关于linux下面的sock5到http的转换工具!
  • linux下面的Gftp有人用过吗?
  • 求助:下面的警告怎么解决?——关于Linux的Session
  • 谁有linux进程管理方面的资料呀,麻烦传一个
  • linux下面的开发工具
  • Linux下面的"匿名管道",是否对应着某种实体?
  • linux下如何看到2000下面的分区
  • 我打算转行到linux下面的软件开发,要准备哪些东西?
  • Linux下面的程序可以在Unix下运行么?一个硬件平台的
  • 请教linux下面的--help功能如何实现???
  • arm S3c2410 上面的 linux 在哪里下载啊 ???
  • 装linux碰到1024柱面的限制怎么办
  • 请教高手:linux原始套接字问题 iis7站长之家
  • linux c/c++ IP字符串转换成可比较大小的数字
  • 在win分区上安装linux和独立分区安装linux有什么区别?可以同时安装吗?(两个linux系统)
  • linux哪个版本好?linux操作系统版本详细介绍及选择方案推荐
  • 在虚拟机上安装的linux上,能像真的linux系统一样开发linux程序么?
  • secureCRT下Linux终端汉字乱码解决方法
  • 我重装window后,把linux的引导区覆盖了,进不了linux怎么办?急啊,望热心的人帮助 (现在有linux的盘)
  • Linux c字符串中不可打印字符转换成16进制
  • 安装vmware软件,不用再安装linux系统,就可以模拟linux系统了,然后可以在其上学习一下LINUX下的基本操作 了?
  • Linux常用命令介绍:更改所属用户群组或档案属性
  • 红旗Linux主机可以通过127.0.0.1访问,但如何是连网的Win2000机器通过Linux的IP去访问Linux
  • linux命令大全详细分类介绍及常用linux命令文档手册下载


  • 站内导航:


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

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

    浙ICP备11055608号-3