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'

Windows 7 または XP、64 ビットまたは 32 ビットの mingw インストールに問題はありません。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 に答える