代码之家  ›  专栏  ›  技术社区  ›  Petr Peller

winpcap mingw编译错误

  •  2
  • Petr Peller  · 技术社区  · 14 年前

    我正在尝试使用WinPCAP4.1.1 Windows库,但我无法编译库中提供的示例源代码。

    我得到这些错误:

    未声明的'pcap_openflag_miscuous'(此函数中首次使用)
    'pcap_src_if_string'未声明(此函数中首次使用)

    还有一堆警告:

    函数“localtime”的隐式声明
    函数“pcap”的隐式声明
    函数“pcap_open”的隐式声明
    函数“scanf”的隐式声明

    我搜索了一下,发现我应该加一行 #define HAVE_REMOTE (我不知道它做了什么),但它会导致更多的错误,比如:

    未定义对'pcap_open'的引用
    未定义对'pcap_findaldevs_ex'的引用
    未定义对“localtime”的引用

    这个 "pcap.h" 似乎包含正确(Eclipse不报告任何包含错误)。 我已将*.lib文件复制到mingw/lib direcotry中,并在 Path and Symbols->Library Paths (Eclipse项目属性)

    我不知道下一步该怎么做。欢迎有任何想法。 提前谢谢

    代码如下:

    #include "pcap.h"
    
    /* prototype of the 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];
    
           /* Retrieve the device list on the local machine */
           if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &alldevs, errbuf) == -1)
           {
                   fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);
                   exit(1);
           }
    
           /* Print the list */
           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");
                   /* Free the device list */
                   pcap_freealldevs(alldevs);
                   return -1;
           }
    
           /* Jump to the selected adapter */
           for(d=alldevs, i=0; i< inum-1 ;d=d->next, i++);
    
           /* Open the device */
           if ( (adhandle= pcap_open(d->name,                      // name of the device
                                                             65536,                        // portion of the packet to capture
                                                                                                   // 65536 guarantees that the whole packet will be captured
    on all the link layers
                                                             PCAP_OPENFLAG_PROMISCUOUS,    // promiscuous mode
                                                             1000,                         // read timeout
                                                             NULL,                         // authentication on the remote machine
                                                             errbuf                        // error buffer
                                                             ) ) == NULL)
           {
                   fprintf(stderr,"\nUnable to open the adapter. %s is not supported by
    WinPcap\n", d->name);
                   /* Free the device list */
                   pcap_freealldevs(alldevs);
                   return -1;
           }
    
           printf("\nlistening on %s...\n", d->description);
    
           /* At this point, we don't need any more the device list. Free it */
           pcap_freealldevs(alldevs);
    
           /* start the capture */
           pcap_loop(adhandle, 0, packet_handler, NULL);
    
           return 0;
    }
    
    
    /* Callback function invoked by libpcap for every incoming packet */
    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;
    
           /*
            * unused variables
            */
           (VOID)(param);
           (VOID)(pkt_data);
    
           /* convert the timestamp to readable format */
           local_tv_sec = header->ts.tv_sec;
           localtime_s(&ltime, &local_tv_sec);
           strftime( timestr, sizeof timestr, "%H:%M:%S", &ltime);
    
           printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
    
    }
    
    2 回复  |  直到 12 年前
        1
  •  4
  •   Alok Singhal    14 年前

    localtime_s

    localtime_r(&local_tv_sec, &ltime);
    

    scanf_s scanf

    localtime_s() scanf_s()

        2
  •  4
  •   Pik Master    12 年前

    iflist.c:(.text+0x9d): undefined reference to `pcap_freealldevs'
    

    sendpack.c:(.text+0x178): undefined reference to `pcap_close'
    

    cd C:\install\winpcap\WpdPack_4_1_2\WpdPack\Examples-pcap\iflist
    gcc -I ../../include -L ../../lib iflist.c -lwpcap -o iflist.exe