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

不到100行的libpcap程序,获取源IP与目的IP完全相同,不知道为什么,请高手给看看,谢谢

    来源: 互联网  发布时间:2016-01-27

    本文导语:  我编写的libpcap程序,分析网络数据包,发现分析出来的源IP与目的IP完全相同,而实际上不是这样的。请高手指点,谢谢。 直接编译:gcc test.c -o test  -lpcap test.c源代码如下(也可以直接下载附件): #include #include...

我编写的libpcap程序,分析网络数据包,发现分析出来的源IP与目的IP完全相同,而实际上不是这样的。请高手指点,谢谢。
直接编译:gcc test.c -o test  -lpcap
test.c源代码如下(也可以直接下载附件):

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

struct ether_header
{
    unsigned char source[6];
    unsigned char dest[6];
    unsigned int type;
};

struct ip_header
{
#ifdef WORDS_BIGENDIAN
    u_int8_t ip_version:4,
        ip_header_length:4;
#else
    u_int8_t ip_header_length:4,
         ip_version:4;
#endif
    u_int8_t ip_tos;      /*type of service */
    u_int16_t ip_length;    /*length */
    u_int16_t ip_id;    /*identity */
    u_int16_t ip_off;    /* offset */
    u_int8_t ip_ttl;    /*time to live*/
    u_int8_t ip_protocol;    /* type of protocol*/
    u_int16_t ip_chechsum;  /* chechsum */
    struct in_addr source;
    struct in_addr dest;
};

void packet_callback(unsigned char* argument,const struct pcap_pkthdr* packet_header, const unsigned char* packet_content)
{
    struct ether_header* eptr;
    struct ip_header* iptr;

    eptr=(struct ether_header*) packet_content;
    switch(ntohs(eptr->type))
    {
        case 0x0800 :/*IP*/
             iptr=(struct ip_header*)(packet_content+14);
             switch(iptr->ip_protocol)
             {
                case 6: /* TCP */
                    printf("%s %s n", inet_ntoa(iptr->source),inet_ntoa(iptr->dest));
                    break;
            }
             break;
    }
    return ;
};

int main(int argc ,char* argv[])
{
    char errbuf[PCAP_ERRBUF_SIZE]; //store the information for error
    char* net_interface; //store the chars of net interface
    bpf_u_int32 ipaddr;
    bpf_u_int32 ipmask;
    pcap_t* pcap_handle; //the handle of pcap
    struct bpf_program    bpf_filter;
    char    bpf_filter_string[]="tcp"; //the filter string 
    
    net_interface=pcap_lookupdev(errbuf);
    pcap_lookupnet(net_interface,&(ipaddr),&(ipmask),errbuf);
    pcap_handle=pcap_open_live(net_interface,BUFSIZ,1,0,errbuf);
    if(pcap_handle==NULL)
    {
        printf("Error in function pcap_open_live. Exiting ...n");
        exit(1);
    }
    if(pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,ipaddr)==-1)
    {
        printf("Error in function pcap_compile. Exiting ...n");
        exit(1);
    }
    if(pcap_setfilter(pcap_handle,&bpf_filter)==-1)
    {
        printf("Error in function pcap_setfilter. Exiting ...n");
        exit(1);
    }
    pcap_loop(pcap_handle,-1,packet_callback,NULL);
    pcap_close(pcap_handle);
    return 0;
}

|
发现这里有个错误
if(pcap_compile(pcap_handle,&bpf_filter,bpf_filter_string,0,ipaddr)==-1)

参数中的ipaddr 应该改为 ipmask,为什么,暂时还没有去了解

sizeof(struct ether_header)是14吗?如果不是,比如是16的话,iptr->source则刚好偏移两个字节,指向了 2.1,和你反映的源和目标ip相同得目标ip192.168.2.1得前两个字节结合,变为
2.1.192.168

^_^纯乱猜

|
一个Libpcap的源码分析

http://www.parsesoft.net/DocumentFiles/d9d17f9f-9c2b-4328-bfdc-e5ce602382e5/index.html

|
不好意思,搞错。是用ipaddr(应该是net) 不是mask
/* 10Mb/s ethernet header */
struct ether_header
{
  u_int8_t  ether_dhost[ETH_ALEN]; /* destination eth addr */
  u_int8_t  ether_shost[ETH_ALEN]; /* source ether addr */
  u_int16_t ether_type;         /* packet type ID field */
} __attribute__ ((__packed__));
这是应是14

你上面的问题爱莫能助

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












  • 相关文章推荐
  • 奇怪,libpcap怎么也抓不到到别的机器的包!!!!!!
  • SOLARIS8安装问题:找不到鼠标,找不到网卡,找不到显卡还说键盘不能用。。。
  • 我想问:我装了xmms,但在程序菜单中找不到,运行"xmms"说找不到该程序,卸载它时又 死掉了,怎么回事啊?
  • 请问import javax.ejb.EJBObject; 到底有没有阿?我的jdk好像说找不到这个,我在它的帮助文档种也找不到??
  • 系统RESET后,我的鼠标就找不到了!然后我想到重新安装,可是安装向导也找不到我的鼠标了!请问我该怎么办?谢谢!
  • 哎!国内打击盗版了,正值Windows转型之季,再也不想上微软件的船了,想转Linux,却也到了买不到Red Hat Linux碟、找不到下载链接的伤感
  • 数据包通过dev_queue_xmit发送出去,dev_queue_xmit返回值为0,但是对方收不到数据包 ,本机也抓不到发送出去的包
  • 用VMWARE刚装完fedora后,找不到ibus输入法,用快捷键shift+ctrl或ctrl+空格也找不到输入法
  • 为什么找不到C++的标准类库
  • mount命令提示找不到介质
  • VMware 下安装LINUX 9找不到硬盘!
  • 为什么我的服务器说找不到jsp文件
  • c/c++ iis7站长之家
  • 在unix 下运行java 为什么找不到类
  • 老是找不到硬盘啊!!!
  • REDHAT8.0怎么会找不到GCC??
  • sendmail邮件收不到问题
  • suse linux找不到网卡
  • 登录后无法启动桌面,出现命令窗口,提示找不到字符集.
  • <新手提问>LINUX下串口收不到数据的问题
  • 我移植了kernel,vivi,cramfs,却找不到网卡


  • 站内导航:


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

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

    浙ICP备11055608号-3