Когда несколько вызовов gethostbyname будут небезопасными?

От gethostbyname(3) - руководство для Linux

The functions gethostbyname() and gethostbyaddr() may return pointers
to static data, which may be overwritten by later calls.  Copying the
struct hostent does not suffice, since it contains pointers; a deep
copy is required.

Я написал программы, которые делают несколько звонков gethostbyname и ничего не сломалось из-за перезаписи статических данных.

Могу ли я попросить пример, когда несколько звонков gethostbyname перезаписать эти статические данные?

3 ответа

Решение

Это будет проблемой, когда вы сделаете что-то вроде этого:

struct hostent *google = gethostbyname("www.google.com");
struct hostent *youtube = gethostbyname("www.youtube.com");

printf("Official name of host for www.google.com: %s\n", google->h_name);
printf("Official name of host for www.youtube.com: %s\n", youtube->h_name);

printf("same? %s\n", google == youtube ? "yes" : "no");

Выход будет

Official name of host for www.google.com: youtube-ui.l.google.com
Official name of host for www.youtube.com: youtube-ui.l.google.com
same? yes

что неверно, так как официальное имя хоста www.google.com является www.google.comи не youtube-ui.l.google.com, Проблема в том, что google а также youtubeуказать в том же месте (как вы можете видеть из same? yes вывод), поэтому информация о www.google.com теряется при выполнении gethostbyname снова.

Если вы, однако, делаете

struct hostent *google = gethostbyname("www.google.com");
printf("Official name of host for www.google.com: %s\n", google->h_name);

struct hostent *youtube = gethostbyname("www.youtube.com");
printf("Official name of host for www.youtube.com: %s\n", youtube->h_name);

тогда вывод будет

Official name of host for www.google.com: www.google.com
Official name of host for www.youtube.com: youtube-ui.l.google.com

Так что пока вы обрабатываете hostent указатель первого gethostbynameпозвоните, прежде чем сделать второй звонок, у вас все будет хорошо.

struct hostent *host1 = gethostbyname("host1");
struct hostent *host2 = gethostbyname("host2");

if(host1......)

второй вызов переписал (возможно) результат первого

Вот пример:

struct hostent *he1 = gethostbyname("host1");
struct in_addr *addr1 = (struct in_addr *)(he1->h_addr);

printf("addr1=%s\n", inet_ntoa(*addr1));    // prints IP1

struct hostent *he2 = gethostbyname("host2");
struct in_addr *addr2 = (struct in_addr *)(he2->h_addr);

printf("addr2=%s\n", inet_ntoa(*addr2));    // prints IP2

printf("addr1=%s\n", inet_ntoa(*addr1));    // prints IP1 (!)
Другие вопросы по тегам