У меня есть небольшое клиент-серверное приложение, которое отправляет / получает пакеты обнаружения UDP. Когда получен пакет UDP, я хочу отобразить исходный IP. Код клиент / сервер основан на примере UDP от Beej: https://beej.us/guide/bgnet/html/multi/clientserver.html
Когда я компилирую для 64-битной версии, IP отображается так, как ожидалось, но когда я компилирую для 32-битной версии (опция -m32), он вообще не получает правильного значения.
Фрагмент кода:
// get sockaddr, IPv4 or IPv6:
void *get_in_addr(struct sockaddr *sa)
{
if (sa->sa_family == AF_INET) {
return &(((struct sockaddr_in*)sa)->sin_addr);
}
return &(((struct sockaddr_in6*)sa)->sin6_addr);
}
...
printf("listener: waiting to recvfrom...\n");
addr_len = sizeof their_addr;
if ((numbytes = recvfrom(sockfd, buf, MAXBUFLEN-1 , 0,
(struct sockaddr *)their_addr, &addr_len)) == -1) {
perror("recvfrom");
exit(1);
}
printf("listener: got packet from %s\n",
inet_ntop(their_addr->sa_family,
get_in_addr((struct sockaddr *)their_addr),
s, sizeof s));
printf("Sockaddr: ");
for (i=0; i<sizeof(struct sockaddr_in); i++)
printf("%x ", ((char *)their_addr)[i]);
printf("\n");
Правильный вывод при компиляции для 64 бит:
listener: waiting to recvfrom...
listener: got packet from 192.168.20.6
Sockaddr: 2 0 ffffff80 19 ffffffc0 ffffffa8 14 6 64 2e 40 0 0 0 0 0
Неверный вывод при компиляции с -m32:
listener: waiting to recvfrom...
listener: got packet from 168.32.140.255
Sockaddr: 2 0 ffffff80 19 ffffffa8 20 ffffff8c ffffffff 50 ffffffdd 7d fffffff7 4 0 0 0
Я не очень понимаю, почему возникает проблема с использованием get_in_addr или inet_ntop при компиляции для 32-битного?