也许是一个指针问题。 Linux程序+ libpcap + getopt_long()+ C语言

时间:2010-10-25 11:04:08

标签: c pointers getopt-long

我正在使用libpcap库为我的大学项目制作网络嗅探器。大多数代码没有任何问题,但是,我坚持以下问题。我使用getopt_long()函数添加了五个命令行选项,但是一个选项无法正常工作。

该选项为-d (--device_info),用于打印与界面关联的I.P addressnetmask。它需要一个参数,即要为其打印信息的interface的名称。

程序代码的必要部分如下。我的问题是,即使我明确地将interface的名称分配给char *device(第35行),然后将其作为参数传递给print_device_info()(第36行),当{ {1}}执行,它总是执行print_device_info()块(第4行),即ifchar *device始终等于NULL,即使我将其作为参数传递。

我是初学程序员,这是我正在开发的第一个“真正的”项目。我想这是一个指针问题,但我不确定。

请注意,还建议一些方法来解决它。

print_device_info()

编辑:这里我发布了原始程序的编辑版本。这个编辑版本本身就是一个完整的程序,因此应该足以满足将来的任何查询。

1)   //Prints information associated with an interface.
 2)   void print_device_info(char *device)
 3)   { 
      ...
      ...
      ...

 4)     if(device == NULL);
 5)      {
 6)       fprintf(stdout, "No interface specified \n");
 7)       exit(1);
 8)      }
      ...
      ...
      ...
 9)    }

 10)   int main(int argc, char *argv[])
 11)   { 
 12)     int next_option; // Options

 13)     char *device=NULL; // NIC to sniff packet from. 

 14)     // A string listing valid short options letters.
 15)     const char* const short_options = "ho:i:d:p";

 16)     /* An array describing valid long options. */
 17)     const struct option long_options[] = 
 18)      {
 19)       { "help",        0, NULL, 'h' },
 20)       { "output",      1, NULL, 'o' },
 21)       { "interface",   1, NULL, 'i' },
 22)       { "device_info", 1, NULL, 'd' },
 23)       { "promisc_off", 0, NULL, 'p' },
 24)       { NULL,          0, NULL,  0  } /* Required at end of array. */
 25)      };

 26)     //Check the arguments and perform their respective functions
 27)   do {
 28)     next_option = getopt_long (argc, argv, short_options,
 29)                                 long_options, NULL);
 30)     switch (next_option)
 31)     {
 32)       case 'd':    /* -d or --device_info */
 33)        /* User has requested information associated an interface. Print it to standard
 34)           output, and exit with exit code zero (normal termination). */
 35)        device = optarg;
 36)        print_device_info (device);
 37)     }
 38)     }while (next_option != -1);
       }

2 个答案:

答案 0 :(得分:3)

在测试结束时你有一个迷路分号(;)。

这意味着测试控制的唯一内容是空表达式,if语句后面的块只是一个嵌套块(将始终执行)。

答案 1 :(得分:2)

我修改了你的代码以打破arg-reading循环,它完全按照我的预期运行:

$ ./longopt
(空)
$ ./longopt -d eth0
eth0的

以下是代码:

#include <stdio.h>
#include <stdlib.h>
#include <getopt.h>


int main(int argc, char *argv[])
{ 
    int next_option; // Options
    char *device=NULL; // NIC to sniff packet from.

    // A string listing valid short options letters.
    const char* const short_options = "ho:i:d:p";

    /* An array describing valid long options. */
    const struct option long_options[] = 
        {
            { "help",        0, NULL, 'h' },
            { "output",      1, NULL, 'o' },
            { "interface",   1, NULL, 'i' },
            { "device_info", 1, NULL, 'd' },
            { "promisc_off", 0, NULL, 'p' },
            { NULL,          0, NULL,  0  } /* Required at end of array. */
        };

    //Check the arguments and perform their respective functions
    while(1) {
        next_option = getopt_long (argc, argv, short_options,
                                   long_options, NULL);
        if (next_option == -1)
            break;


        switch (next_option)
        {
            case 'd':    /* -d or --device_info */
                /* User has requested information associated an interface. Print it to standard
                   output, and exit with exit code zero (normal termination). */
                device = optarg;


        }
    } 

    printf("%s\n", device);

    return(0);

}