2012-04-25 15 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); 

最後の行にセグメンテーションがあります。私はhostentの適切な使い方を見て、msdn docsはこれを正確にこのように使用していることを示しています。セグメンテーションの原因は何ですか?なぜこのホストはsegfaultを引き起こしますか?

+0

gethostbyaddreがNULLをリターンし、NULLを参照解除するとsegfaultが発生する可能性があります。またはhostName-> h_nameがNULLの場合、NULLセグメンテーションをprintf()します。 –

答えて

1

gethostbyaddr()関数はエラーの場合にはNULLを返しますが、あなたのコードでそれを確認することはできません。 NULLポインタの参照を解除しようとすると、segfaultが発生します。あなたは(manページがherror()が時代遅れであることを示しているが)、リゾルバによって発生した実際のエラーを印刷するherror()機能を使用することができる場合が

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

はあなたのような何かを必要としています。

関連する問題