Как получить номер порта от addrinfo в Unix c

Я должен отправить некоторые данные на удаленный сервер через UDP в конкретном порте и добраться, получают ответ от него. Однако это блокируется, и я не получаю ответа. Я должен проверить, если значение addrinfo, которое я получаю от getaddrinfo(SERVER_NAME, port, &hints, &servinfo) корректно или нет.

Как я получаю номер порта от этой структуры данных?

Я знаю inet_ntop(p->ai_family, get_in_addr((struct sockaddr *)p->ai_addr),s, sizeof s) дает мне IP-адрес сервера. (Я использую метод в руководстве Beej.)

10
задан rpy 30 November 2016 в 22:10
поделиться

1 ответ

Вы делаете что-то похожее на то, что делает функция Beej get_in_addr:

// get port, IPv4 or IPv6:
in_port_t get_in_port(struct sockaddr *sa)
{
    if (sa->sa_family == AF_INET) {
        return (((struct sockaddr_in*)sa)->sin_port);
    }

    return (((struct sockaddr_in6*)sa)->sin6_port);
}

Также остерегайтесь ловушки №1, связанной с номерами портов в структурах sockaddr_in (или scokaddr_in6): номера портов всегда хранится в сетевом порядке байтов .

Это означает, например, что если вы распечатываете результат вышеупомянутого вызова "get_in_port", вам нужно добавить "ntohs ()":

printf("port is %d\n",ntohs(get_in_port((struct sockaddr *)p->ai_addr)));
27
ответ дан 3 December 2019 в 15:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: