2

我正在尝试使用适用于 Windows 的 WinPcap 4.1.1 库,但我什至无法编译随库提供的示例源代码。

我收到这些错误:

'PCAP_OPENFLAG_PROMISCUOUS' 未声明(首次在此函数中使用)
'PCAP_SRC_IF_STRING' 未声明(首次在此函数中使用)

和一堆警告:

函数“localtime_s”的
隐式声明 函数“pcap_findalldevs_ex”的
隐式声明 函数“pcap_open”的
隐式声明 函数“scanf_s”的隐式声明

我用谷歌搜索了一下,发现我应该添加一行#define HAVE_REMOTE(我不知道它是做什么的),但它会导致更多这样的错误:

对“pcap_open”的
未定义引用 对“pcap_findalldevs_ex”的
未定义引用 对“localtime_s”的未定义引用

似乎已"pcap.h"正确包含(eclipse 不报告任何包含错误)。我已将 *.lib 文件复制到 MinGW/lib 目录中并在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);

}
4

2 回答 2

4

您可以将您的localtime_s电话替换为:

localtime_r(&local_tv_sec, &ltime);

(注意交换的参数。)

另外,将您的scanf_s电话替换为scanf.

localtime_s()并且scanf_s()是 Microsoft 特定的扩展,在 MinGW 中不可用。

于 2010-02-18T10:06:42.770 回答
4

这有点松散相关,但我发现要克服它是有问题的,所以我想做出贡献,所以其他研究这个线程的人实际上找到了解决方案。

传递给 GCC 的参数顺序重要,您需要在“-lwpcap”之前指定“.c”文件,否则会出现链接错误:如

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

或者

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

您的 mingw 安装没有问题,Windows 7 或 XP,64 位或 32 位,它只是传递给 GCC 的参数的顺序。

所以我用于编译的实际命令是:

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

我希望这有帮助。

于 2012-12-27T11:56:04.880 回答