qq_17047767 2015-08-01 03:56
浏览 1794

WinpCap抓不到ARP的包。禁用蓝牙后启用蓝牙就又收的到。但是只是这一小会可以收到。

我用WireShark可以抓到ARP包,但是用自己写的代码抓不到ARP包。抓IP之类的还是可以抓到。

过滤器设置的就是ARP。

应该是一些常规代码:
{
pcap_if_t *alldevs;
pcap_if_t *d;

int inum;
int i = 0;
pcap_t *adhandle;
char errbuf[PCAP_ERRBUF_SIZE];
u_int netmask;
char packet_filter[] = "arp";
struct bpf_program fcode;

/* 获得设备列表 */
if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
{
    fprintf(stderr, "Error in pcap_findalldevs: %s\n", errbuf);
    exit(1);
}

/* 打印列表 */
for (d = alldevs; d; d = d->next)
{
    printf("%d. %s", ++i, d->name);
    if (d->description)
        printf(" (%s)\n", d->description);
    else
        printf(" (No description available)\n");
}

if (i == 0)
{
    printf("\nNo interfaces found! Make sure WinPcap is installed.\n");
    return -1;
}

printf("Enter the interface number (1-%d):", i);
scanf_s("%d", &inum);

if (inum < 1 || inum > i)
{
    printf("\nInterface number out of range.\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

/* 跳转到已选设备 */
for (d = alldevs, i = 0; i< inum - 1; d = d->next, i++);

/* 打开适配器 */
if ((adhandle = pcap_open(d->name,  // 设备名
    65536,     // 要捕捉的数据包的部分 
    // 65535保证能捕获到不同数据链路层上的每个数据包的全部内容
    PCAP_OPENFLAG_PROMISCUOUS,         // 混杂模式
    0,      // 读取超时时间
    NULL,      // 远程机器验证
    errbuf     // 错误缓冲池
    )) == NULL)
{
    fprintf(stderr, "\nUnable to open the adapter. %s is not supported by WinPcap\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

/* 检查数据链路层,为了简单,我们只考虑以太网 */
if (pcap_datalink(adhandle) != DLT_EN10MB)
{
    fprintf(stderr, "\nThis program works only on Ethernet networks.\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

if (d->addresses != NULL)
    /* 获得接口第一个地址的掩码 */
    netmask = ((struct sockaddr_in *)(d->addresses->netmask))->sin_addr.S_un.S_addr;
else
    /* 如果接口没有地址,那么我们假设一个C类的掩码 */
    netmask = 0xffffff;


//编译过滤器
if (pcap_compile(adhandle, &fcode, packet_filter, 1, netmask) <0)
{
    fprintf(stderr, "\nUnable to compile the packet filter. Check the syntax.\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

//设置过滤器
if (pcap_setfilter(adhandle, &fcode)<0)
{
    fprintf(stderr, "\nError setting the filter.\n");
    /* 释放设备列表 */
    pcap_freealldevs(alldevs);
    return -1;
}

printf("\nlistening on %s...\n", d->description);

/* 释放设备列表 */
pcap_freealldevs(alldevs);

/* 开始捕捉 */
pcap_loop(adhandle, 3, packet_handler2, NULL);
system("pause");
return 0;

}

  • 写回答

0条回答 默认 最新

    报告相同问题?

    悬赏问题

    • ¥15 多电路系统共用电源的串扰问题
    • ¥15 shape_predictor_68_face_landmarks.dat
    • ¥15 slam rangenet++配置
    • ¥15 有没有研究水声通信方面的帮我改俩matlab代码
    • ¥15 对于相关问题的求解与代码
    • ¥15 ubuntu子系统密码忘记
    • ¥15 信号傅里叶变换在matlab上遇到的小问题请求帮助
    • ¥15 保护模式-系统加载-段寄存器
    • ¥15 电脑桌面设定一个区域禁止鼠标操作
    • ¥15 求NPF226060磁芯的详细资料