Когда несколько вызовов 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 (!)