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);

最後の行でセグメンテーション違反になります。hostent の適切な使用法を調べたところ、msdn のドキュメントでは、まさにこのように使用されていることが示されています。セグメンテーション違反の原因は何ですか?

4

1 に答える 1

1

gethostbyaddr()関数はエラーの場合に戻りますがNULL、コードでそれをチェックしていません。ポインターを逆参照しようとするNULLと、segfault が発生します。

次のようなものが必要です:

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

herror()この関数を使用して、リゾルバーで発生した実際のエラーを出力できる場合があります (ただし、man ページでherror()は廃止されていることが示されています)。

于 2012-04-25T20:43:31.400 に答える