2012-04-25 4 views
0
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 показывают, что он используется ТОЧНО, как это. Что может вызвать segfault?Почему этот хозяин вызывает segfault?

+0

Возможно, gethostbyaddre resturns NULL и разыменование NULL вызывает segfault; или hostName-> h_name - NULL, а затем printf() 'nULL segfaults. –

ответ

1

Функция gethostbyaddr() возвращает NULL в случае ошибки, и я не вижу, чтобы вы проверяли это в своем коде. Попытка разыменовать указатель NULL вызовет segfault.

Вам нужно что-то вроде:

if (hostName == NULL) { 
    printf("There was an error!\n"); 
    exit(1); 
} 

Вы можете быть в состоянии использовать функцию herror() распечатать фактическую ошибку, встречаемое распознаватель страницу (хотя человек указывает, что herror() является устаревшим).

Смежные вопросы