2

我怎么知道 astring是 thecanonical name还是 the IP address

因为如果argv[1]IP address我做的:

sscanf(argv[2],"%" SCNu16,&server_port);
inet_aton(argv[1],&server_address);

remote_address.sin_family = AF_INET;
remote_address.sin_port = htons(server_port); 
remote_address.sin_addr = server_address;  

如果 argv[1] 是canonical name我做的:

h = gethostbyname(server);

indirizzo_remoto.sin_family = AF_INET;
indirizzo_remoto.sin_port = htons(porta_server); 
indirizzo_remoto.sin_addr = XYZ;

另外,我必须用什么来代替XYZ

可能的解决方案:

struct in_addr indirizzo_server; 
struct hostent *h; 

h = gethostbyname(server); 

inet_aton(h->h_addr_list[0],&indirizzo_server); 

indirizzo_remoto.sin_family = AF_INET; 
indirizzo_remoto.sin_port = htons(porta_server); 
indirizzo_remoto.sin_addr = indirizzo_server;
4

2 回答 2

3

熟悉getaddrinfo(3)一下就可以了,而且还支持IPv6。

于 2013-06-14T14:40:25.060 回答
2

为什么会起毛?gethostbyname已经处理好了。引用手册

[...]name 可以是主机名,也可以是标准点表示法的 IPv4 地址(如 inet_addr(3)),或者是冒号(也可能是点)表示法的 IPv6 地址。

所以删除特殊处理inet_aton就可以了。

关于XYZ部分:该hostent结构包含您必须复制到您的两件事in_addr

  • h_addrtype可能表示 IPv4 或 IPv6。将其复制到sin_family.
  • 中的实际地址h_add_list。将此复制到您的sin_addrusingmemcpyh_length.

这应该自动处理 IPv4 和 IPv6。

于 2013-06-14T14:45:00.300 回答