質問

I know this topic has probably been done to death, but I've been unable to find anything that made me understand it. I need to enter a value, for instance an IP address, into the command line and pass it to a function.

Below is my getopt_long function.

while (1)
{
    static struct option long_options[] =
    {
        /* Options */
    {"send",       no_argument,       0, 's'}, /* args s and r have no function yet */
    {"recieve",    no_argument,       0, 'r'},
    {"file",       required_argument, 0, 'f'}, 
    {"destip",     required_argument, 0, 'i'},
    {"destport",   required_argument, 0, 'p'},
    {"sourceip",   required_argument, 0, 'o'},
    {"sourceport", required_argument, 0, 't'},
    {0, 0, 0, 0}
    };

   int option_index = 0;

   c = getopt_long (argc, argv, "srf:d:i:p:o:t:",
                long_options, &option_index);

              /* Detect the end of the options. */
   if (c == -1)
     break;

   switch (c)
     {
     case 0:
       /* If this option set a flag, do nothing else now. */
       if (long_options[option_index].flag != 0)
         break;
       printf ("option %s", long_options[option_index].name);
       if (optarg)
         printf (" with arg %s", optarg);
       printf ("\n");
       break;

     case 's':
       puts ("option -s\n");
       break;

     case 'r':
       puts ("option -r\n");
       break;

     case 'f':
       printf ("option -f with value `%s'\n", optarg);
       break;

     case 'i':
       printf ("option -i with value `%s'\n", optarg);
       break;

     case 'p':
       printf ("option -p with value `%s'\n", optarg);
       break;

     case 'o': 
       printf ("option -o with value `%s'\n", optarg);
       break;

     case 't': 
       printf ("option -t with value `%s'\n", optarg);
       break;

     case '?':
       /* Error message printed */
       break;

     default:
       abort ();
     }
}

/* Print any remaining command line arguments (not options). */
if (optind < argc)
{
    printf ("non-option ARGV-elements: ");
    while (optind < argc)
    printf ("%s ", argv[optind++]);
    putchar ('\n');
}

This is where I need the value to go (part of a pretty standard tcp struct)

ip->iph_sourceip = inet_addr(arg);

How do I do this correctly? I researched quite a bit, and although many cover similar topics they do not seem to explain my issue all too well.

役に立ちましたか?

解決

When using getopt, you'll typically declare variables that match the various switches, so that you can act on them later, once argument parsing has completed; some arguments you can act on immediately during argument processing.

For instance you might have an address variable for storing the address from the -i command, similarly for the -p argument:

in_addr_t address;
int port;

// ... later in your switch statement:
switch (c)
{
    // ...

   case 'i':
       printf("option -i with value `%s'\n", optarg);
       address = inet_addr(optarg);
       break;
   case 'p':
       printf("option -p with value `%s'\n", optarg);
       // be sure to add handling of bad (non-number) input here
       port = atoi(optarg);
       break;
    // ...
}

// later in your code, e.g. after arg parsing, something like:
send_tcp(address, port);
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top