Как получить номер порта от addrinfo в unix c - PullRequest
9 голосов
/ 03 марта 2010

Мне нужно отправить некоторые данные на удаленный сервер по 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-адрес сервера. (Я использую метод в руководстве Биджа.)

1 Ответ

26 голосов
/ 03 марта 2010

Вы делаете что-то похожее на то, что делает функция 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)));
...