Почему этот случай вызывает segfault?
struct hostent *hostName;
struct in_addr ipv4addr;
inet_pton(AF_INET, inet_ntoa(client.sin_addr), &ipv4addr);
hostName = gethostbyaddr(&ipv4addr, sizeof(ipv4addr), AF_INET);
printf("Host name: %s\n", hostName->h_name);
Это segfaults на последней строке. Я искал правильное использование hostent, и документы MSDN показывают, что он используется именно так. Что может стать причиной ошибки?
1 ответ
Решение
gethostbyaddr()
функция возвращает NULL
в случае ошибки, и я не вижу, чтобы вы проверяли это в своем коде. Попытка разыменования NULL
Указатель может вызвать ошибку.
Вам нужно что-то вроде:
if (hostName == NULL) {
printf("There was an error!\n");
exit(1);
}
Вы можете использовать herror()
функция для распечатки фактической ошибки, обнаруженной распознавателем (хотя страница руководства указывает, что herror()
устарел).