Почему этот случай вызывает 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() устарел).

Другие вопросы по тегам