我正在使用libpcap
库为我的大学项目制作网络嗅探器。大多数代码没有任何问题,但是,我坚持以下问题。我使用getopt_long()
函数添加了五个命令行选项,但是一个选项无法正常工作。
该选项为-d (--device_info)
,用于打印与界面关联的I.P address
和netmask
。它需要一个参数,即要为其打印信息的interface
的名称。
程序代码的必要部分如下。我的问题是,即使我明确地将interface
的名称分配给char *device
(第35行),然后将其作为参数传递给print_device_info()
(第36行),当{ {1}}执行,它总是执行print_device_info()
块(第4行),即if
中char *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);
}
答案 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);
}