Как получить значение от optarg

Привет, я пишу простую клиент-серверную программу. В этой программе я должен использовать getopt() чтобы получить номер порта и ip-адрес следующим образом:

server -i 127.0.0.1 -p 10001

Я не знаю, как я могу получить значения из optarg, чтобы использовать их позже в программе.

Как об этом:

 char buf[BUFSIZE+1]; snprintf(buf,BUFSIZE,"%s",optarg); 

Или в более полном примере:

 #include  #include  #define BUFSIZE 16 int main( int argc, char **argv ) { char c; char port[BUFSIZE+1]; char addr[BUFSIZE+1]; while(( c = getopt( argc, argv, "i:p:" )) != -1 ) switch ( c ) { case 'i': snprintf( addr, BUFSIZE, "%s", optarg ); break; case 'p': snprintf( port, BUFSIZE, "%s", optarg ); break; case '?': fprintf( stderr, "Unrecognized option!\n" ); break; } return 0; } 

Для получения дополнительной информации см. Документацию Getopt .

Вы используете цикл while, чтобы перемещаться по всем аргументам и обрабатывать их так …

 #include  int main(int argc, char *argv[]) { int option = -1; char *addr, *port; while ((option = getopt (argc, argv, "i:p:")) != -1) { switch (option) { case 'i': addr = strdup(optarg); break; case 'p': port = strdup(optarg); break; default: /* unrecognised option ... add your error condition */ break; } } /* rest of program */ return 0; } 

Это один из многочисленных недостатков документации getopt: в нем явно не указано, что optarg должен быть скопирован для последующего использования (например, с использованием strdup ()), поскольку он может быть перезаписан более поздними опциями или просто освобожден getopt.

В случае ip и порта вам не нужно хранить строки. Просто проанализируйте их и сохраните значения в sockaddr.

 #include  // for inet_ntop, inet_pton #include  // for getopt, optarg #include  // for sockaddr_in, etc #include  // for fprintf, printf, stderr #include  // for atoi, EXIT_SUCCESS #include  // for memset #include  // for AF_INET int main(int argc, char *argv[]) { struct sockaddr_in sa; char c; memset(&sa, 0, sizeof(sa)); sa.sin_family = AF_INET; sa.sin_addr.s_addr = htonl(INADDR_ANY); sa.sin_port = 0; while ((c = getopt(argc, argv, "i:p:")) != -1) { switch (c) { case 'p': sa.sin_port = htons(atoi(optarg)); break; case 'i': inet_pton(AF_INET, optarg, &(sa.sin_addr)); break; case '?': fprintf(stderr, "Unknown option\n"); break; } /* ----- end switch ----- */ } char str[INET_ADDRSTRLEN]; inet_ntop(AF_INET, &(sa.sin_addr), str, INET_ADDRSTRLEN); printf("%s:%d\n", str, ntohs(sa.sin_port)); return EXIT_SUCCESS; } /* ---------- end of function main ---------- */