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