首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 .NET Java 游戏 视频 人才 外包 培训 数据库 书店 程序员
中国软件网
欢迎您:游客 | 登录 注册 帮助
  • 100分求教 winpcap 和 libnet 都不能发包 走投无路了…… [无满意答案结帖,结帖人:xmjt621]
    进入用户个人空间
    加为好友
    发送私信
    在线聊天
    • xmjt621
    • 等级:
    • 可用分等级:
    • 总技术分:
    • 总技术分排名:
    • 结帖率:
    发表于:2008-08-21 00:09:57 楼主
    我已参考网上各种资料 搜索了三天 均找不到答案

    我先用winpcap 后用libnet
    include,lib,link等设置都已弄好 编译无措
    我有一张普通以太网卡,一张无线网卡,ADSL接入后会显示第三个网络设备
    我用前两个网卡name作参数都发包正常,但用ADSL显示的网卡九无法发包
    不论winpcap还是libnet都是一样,发包函数返回错误,并且errBuf里没有错误代码
    经调试发现最终错误发生在winpcap的PacketSendPacket函数中(libnet的libnet_write函数最终调用的也是这个)

    更奇怪的是我的普通以太网卡连着adsl modem,包发出去应该能捕捉到的,可是我用抓包软件也看不到
    我怀疑根本就没能发出去

    我刚学的网络编程,如果有说的不明白的地方还请见谅,恳请各位前辈指导!!!

    测试代码如下:(用每块网卡对一个地址发一个SYN包,libnet的代码简洁点,只贴上这个)

    #include <pcap.h>
    #include <remote-ext.h>
    #include <win32/libnet.h>
    #include <iostream.h>
    #pragma comment(lib, "libnet")
    #pragma comment(lib, "packet")
    #pragma comment(lib, "wpcap")

    int main()
    {
        pcap_if_t *alldevs;
        pcap_if_t *d;
        char errbuf[PCAP_ERRBUF_SIZE+1];
        int i = 0;
       
        /* 获得接口列表 */
        if (pcap_findalldevs(&alldevs, errbuf) == -1)
        {
            fprintf(stderr,"Error in pcap_findalldevs: %s\n",errbuf);
            exit(1);
        }
       
        libnet_t *l;
        //int packet_size;//存放数据包长度的变量
       
        libnet_ptag_t t;//协议块标记
        char *device = NULL;//设备名字,此时为NULL
       
        u_long destination_ip = inet_addr("222.64.198.99");// 目的IP地址
        u_long source_ip = 0;//源IP地址
        int c;
        //unsigned char buf[20];
       
        pcap_addr_t *a;
       
        /* IP addresses */
        for(d= alldevs; d; d= d->next) {
            a=d->addresses;
           
            if (!a)
            {
                continue ;
            }
            switch(a->addr->sa_family)
            {
            case AF_INET:

                source_ip = ((sockaddr_in *)(a->addr))->sin_addr.s_addr;

                l = libnet_init(
                    LIBNET_RAW4,//libnet类型
                    d->name,//网络设备
                    errbuf);
                if (l == NULL)
                {
                    fprintf(stderr, "libnet_init() failed: %s", errbuf);
                    continue ;
                }
               
                t = libnet_build_tcp(
                    7000,                                    /* source port */
                    8000,                                    /* destination port */
                    0x01010101,                                /* sequence number */
                    0x02020202,                                /* acknowledgement num */
                    TH_SYN,                                    /* control flags */
                    512,                                      /* window size */
                    0,                                          /* checksum */
                    10,                                        /* urgent pointer */
                    LIBNET_TCP_H,                              /* TCP packet size */
                    NULL,                                    /* payload */
                    0,                                  /* payload size */
                    l,                                          /* libnet handle */
                    0);                                        /* libnet id */
               
                if (t == -1)
                {
                    fprintf(stderr, "Can't build TCP header: %s\n", libnet_geterror(l));
                    return 1;
                }

                t = libnet_build_ipv4(
                    LIBNET_IPV4_H + LIBNET_TCP_H,              /* length */
                    0,                                          /* TOS */
                    242,                                        /* IP ID */
                    0,                                          /* IP Frag */
                    64,                                        /* TTL */
                    IPPROTO_TCP,                                /* protocol */
                    0,                                          /* checksum */
                    source_ip,                                    /* source IP */
                    destination_ip,                                    /* destination IP */
                    NULL,                                      /* payload */
                    0,                                          /* payload size */
                    l,                                          /* libnet handle */
                    0);                                        /* libnet id */
                if (t == -1)
                {
                    fprintf(stderr, "Can't build IP header: %s\n", libnet_geterror(l));
                    return 1;
                }
               
                /*
                *  Write it to the wire.
                */
               
                c = libnet_write(l);
                if (c == -1)
                {
                    fprintf(stderr, "Write error: %s\n", libnet_geterror(l));
                    return 1;
                }
                else
                {
                    fprintf(stderr, "Wrote %d byte TCP packet; check the wire.\n", c);
                }
                libnet_destroy(l);
                         
                break;
               
            case AF_INET6:
                break;
               
            default:
                printf("\tAddress Family Name: Unknown\n");
                break;
            }
        }

        pcap_freealldevs(alldevs);
        return 0;
    }


    我运行的结果:

    Wrote 54 byte TCP packet; check the wire.
    Wrote 54 byte TCP packet; check the wire.
    Write error:
    100  修改 删除 举报 引用 回复

    网站简介广告服务网站地图帮助联系方式诚聘英才English 问题报告
    北京创新乐知广告有限公司 版权所有 京 ICP 证 070598 号
    世纪乐知(北京)网络技术有限公司 提供技术支持
    Copyright © 2000-2008, CSDN.NET, All Rights Reserved