Проблема с приведением аргумента argv [] к uint16_t - PullRequest
0 голосов
/ 27 января 2020

Я создал соединение через сокет tcp между двумя ПК, и теперь я хочу, чтобы клиент мог выбирать ip и порт из командной строки (./client ip port), но у меня возникли некоторые проблемы с приведением аргумента argv порта для фактического типа порта (uint16_t). Вот код функции, которая устанавливает соединение: извините за итальянское именование переменных; я пометил '-' строками, которые дают мне ошибку

 int connettiAlServer(char **argv, char *indirizzoServer) {
      int socketDesc;
    -  uint16_t porta = (uint16_t)argv[2];
      indirizzoServer = ipResolver(argv);
      struct sockaddr_in mio_indirizzo;
      mio_indirizzo.sin_family = AF_INET;
   -  mio_indirizzo.sin_port = htons(porta);
      inet_aton(indirizzoServer, &mio_indirizzo.sin_addr);
      if ((socketDesc = socket(PF_INET, SOCK_STREAM, 0)) < 0)
        perror("Impossibile creare socket"), exit(-1);
      else
        printf("Socket creato\n");
      if (connect(socketDesc, (struct sockaddr *)&mio_indirizzo,
                  sizeof(mio_indirizzo)) < 0)
        perror("Impossibile connettersi"), exit(-1);
      else
        printf("Connesso a %s\n", indirizzoServer);
      return socketDesc;
    }

Ошибка заключается в следующем в первой отмеченной строке:

warning: cast from pointer to integer of different size [-Wpointer-to-int-cast]
   45 |   uint16_t porta = (uint16_t)argv[2];

1 Ответ

1 голос
/ 27 января 2020

argv - это, по сути, массив строк . Вы не можете преобразовать строку в число простым преобразованием. Вам нужно использовать такую ​​функцию, как strtoul:

uint16_t porta = strtoul(argv[2], NULL, 10);

Чтобы быть более точным c, то, что происходит, когда вы делаете (uint16_t) argv[2], это преобразование указатель в argv[2] на uint16_t. Результирующее значение будет 16 младшими битами самого фактического указателя.

...