Ошибка компиляции Winpcap MinGW - PullRequest
2 голосов
/ 18 февраля 2010

Я экспериментирую с библиотеками WinPcap 4.1.1 для Windows, но мне не удается скомпилировать даже пример исходного кода, поставляемого с библиотекой.

Я получаю эти ошибки:

«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);

}

Ответы [ 2 ]

4 голосов
/ 27 декабря 2012

Это несколько слабо связано, но я нашел, что преодолеть его проблематично, поэтому я хочу внести свой вклад, чтобы другие люди, изучающие эту ветку, действительно нашли решение.

Порядок параметров, передаваемых в GCC важно , вам необходимо указать ваш файл ".c" перед "-lwpcap", в противном случае вы получите ошибки компоновки: например,

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

Надеюсь, это поможет.

4 голосов
/ 18 февраля 2010

Вы можете заменить свой localtime_s звонок на:

localtime_r(&local_tv_sec, &ltime);

(Обратите внимание на измененные аргументы.)

Также замените ваш scanf_s вызов на scanf.

localtime_s() и scanf_s() являются расширениями, специфичными для Microsoft, и недоступны в MinGW.

...