Memcpy и хостентная структура на C
Так gethostbyaddr()
возвращает hostent
,
struct hostent {
char *h_name; /* official name of host */
char **h_aliases; /* alias list */
int h_addrtype; /* host address type */
int h_length; /* length of address */
char **h_addr_list; /* list of addresses */
В теории с memcpy
мы не можем скопировать эту структуру в другую hostent
, потому что h_aliases
а также h_addr_list
,
Итак, я проверил выполнение кода на C.
#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include <string.h>
#include <netdb.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
int main() {
int i;
unsigned char ip[] = {130, 206, 192, 10};
char name[14]="www.apple.com";
struct hostent *initial, *final;
struct in_addr IP;
if ((initial = gethostbyaddr(ip, sizeof (ip), AF_INET)) == NULL)
exit(EXIT_FAILURE);
memcpy(&final, &initial, sizeof(initial)); //memcpy(*dest, *initial, size)
printf("HOST: %s\n", final -> h_name);
for (i = 0; final->h_aliases[i] != NULL; i++)
printf("ALIASES[%d]: %s\n", i, final -> h_aliases[i]);
for (i = 0; final->h_addr_list[i] != NULL; i++) {
IP.s_addr = *((uint32_t*) final->h_addr_list[i]);
printf("IP[%d]: %s\n\n", i, inet_ntoa(IP));
}
if ((initial = gethostbyname(name)) == NULL)
exit(EXIT_FAILURE);
printf("HOST: %s\n", final -> h_name);
for (i = 0; final->h_aliases[i] != NULL; i++)
printf("ALIASES[%d]: %s\n", i, final -> h_aliases[i]);
for (i = 0; final->h_addr_list[i] != NULL; i++) {
IP.s_addr = *((uint32_t*) final->h_addr_list[i]);
printf("IP[%d]: %s\n\n", i, inet_ntoa(IP));
}
}
Т.е. вывод кода:
HOST: a130-206-192-10.deploy.akamaitechnologies.com
IP[0]: 130.206.192.10
HOST: a130-206-192-10.deploy.akamaitechnologies.com
IP[0]: 130.206.192.10
Как видите, одно и то же печатается дважды. Разве это не должно печатать вещи, связанные с Apple во второй раз? Потому что когда я сделал memcpy
Я скопировал указатели h_aliases
а также h_addr_list
на dest struct
,