「已注销」 2019-11-11 11:16 采纳率: 25%
浏览 198

这个写什么代码可以使抓包60s或者按回车键停止?

#define HAVE_REMOTE
#include <pcap.h>
#include <windows.h>

/* packet handler 函数原型 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data);

int main()
{
    pcap_if_t *alldevs;
    pcap_if_t *d;
    int inum;
    int i=0;
    pcap_t *adhandle;
    char errbuf[PCAP_ERRBUF_SIZE];

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

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

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

        /* 开始捕获 */
        pcap_loop(adhandle, , packet_handler, NULL);

        return 0;
}


/* 每次捕获到数据包时,libpcap都会自动调用这个回调函数 */
void packet_handler(u_char *param, const struct pcap_pkthdr *header, const u_char *pkt_data)
{
    struct tm *ltime;
    char timestr[16];
    time_t local_tv_sec;

    /* 将时间戳转换成可识别的格式 */
    local_tv_sec = header->ts.tv_sec;
    ltime=localtime(&local_tv_sec);
    strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);

    printf("%s,%.6ld len:%d\n", timestr, header->ts.tv_usec, header->len);

}

  • 写回答

1条回答 默认 最新

  • dabocaiqq 2019-11-11 11:28
    关注
    评论

报告相同问题?

悬赏问题

  • ¥15 彩灯控制电路,会的加我QQ1482956179
  • ¥200 相机拍直接转存到电脑上 立拍立穿无线局域网传
  • ¥15 (关键词-电路设计)
  • ¥15 如何解决MIPS计算是否溢出
  • ¥15 vue中我代理了iframe,iframe却走的是路由,没有显示该显示的网站,这个该如何处理
  • ¥15 操作系统相关算法中while();的含义
  • ¥15 CNVcaller安装后无法找到文件
  • ¥15 visual studio2022中文乱码无法解决
  • ¥15 关于华为5g模块mh5000-31接线问题
  • ¥15 keil L6007U报错