Comment obtenir une valeur d’optarg

Bonjour, j’écris un programme client-serveur simple. Dans ce programme, je dois utiliser getopt() pour obtenir le numéro de port et l’adresse IP comme ceci:

serveur -i 127.0.0.1 -p 10001

Je ne sais pas comment puis-je obtenir des valeurs de optarg, à utiliser ultérieurement dans le programme.

Que diriez-vous comme ça:

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

Ou dans un exemple plus complet:

 #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; } 

Pour plus d’informations, voir la documentation de Getopt .

Vous utilisez une boucle while pour parcourir tous les arguments et les traiter comme suit …

 #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; } 

C’est l’une des nombreuses failles de la documentation de getopt: elle n’indique pas clairement que optarg doit être copié pour une utilisation ultérieure (à l’aide de strdup (), par exemple) car il peut être écrasé par des options ultérieures ou simplement libéré par getopt.

Dans le cas d’une adresse IP et d’un port, vous n’avez pas besoin de stocker les chaînes. Il suffit de les parsingr et de stocker les valeurs dans un 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 ---------- */