6

libpcapと小さな C プログラムでいくつかのテストを行いたいので、main() から got_packet() に構造体を渡そうとしています。libpcap チュートリアルを読んだ後、私はこれを見つけました:

pcap_loop() のプロトタイプは次のとおりです。

int pcap_loop(pcap_t *p, int cnt, pcap_handler callback, u_char *user)

最後の引数は一部のアプリケーションで役立ちますが、多くの場合、単純に NULL に設定されます。pcap_loop() が送信する引数に加えて、コールバック関数に送信したい独自の引数があるとします。これが私たちが行う場所です。明らかに、結果が正しくそこに到達するようにするには、u_char ポインターに型キャストする必要があります。後で説明するように、pcap は u_char ポインターの形式で情報を渡す非常に興味深い手段を利用します。

これによると、pcap_loop() の引数番号 4 を使用して、got_packet() で構造体を送信することが可能です。しかし、試した後、エラーが発生します。

ここに私の(バグのある)コードがあります:

int main(int argc, char **argv)
{
 /* some line of code, not important */

 /* def. of the structure: */
 typedef struct _configuration Configuration;
 struct _configuration {
   int id;
   char title[255];
 };

 /* init. of the structure: */
 Configuration conf[2] = {
   {0, "foo"},
   {1, "bar"}};

 /* use pcap_loop with got_packet callback: */
 pcap_loop(handle, num_packets, got_packet, &conf);
}

void got_packet(u_char *args, const struct pcap_pkthdr *header, const u_char *packet)
{
 /* this line don't work: */
 printf("test: %d\n", *args[0]->id);
}

いくつかのテストの後、この種のエラーが発生します。

gcc -c got_packet.c -o got_packet.o
got_packet.c: In function ‘got_packet’:
got_packet.c:25: error: invalid type argument of ‘->’

got_packet() 関数でconf (構成構造の配列)を渡すためにこのコードを編集する方法がわかりますか?

助けてくれてありがとう。

よろしく

4

3 に答える 3

5

私はあなたのコードを書き直しました。今はエラーなしでコンパイルされています:

#include <pcap.h> 

typedef struct {
  int id;
  char title[255];
} Configuration;

void got_packet( Configuration args[], const struct pcap_pkthdr *header, const u_char *packet){
  (void)header, (void)packet;
  printf("test: %d\n", args[0].id);
}

int main(void){
  Configuration conf[2] = {
    {0, "foo"},
    {1, "bar"}};

  pcap_loop(NULL, 0, (pcap_handler)got_packet, (u_char*)conf);
}
于 2009-11-14T15:48:50.637 に答える
2

main() の外で構造を定義し、次のように got_packet() で引数をキャストする必要があります。

Configuration *conf = (Configuration *) args;
printf ("test: %d\n", conf[0].id);
于 2009-11-14T15:31:23.417 に答える