规范名称或IP地址 - 套接字,linux和C.

时间:2013-06-14 14:32:49

标签: c sockets berkeley-sockets

我如何知道stringcanonical name还是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;

2 个答案:

答案 0 :(得分:3)

熟悉可以执行任何操作的getaddrinfo(3),并且还支持IPv6。

答案 1 :(得分:1)

为什么要模糊? gethostbyname已经解决了这个问题。引用manual

  

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

所以删除inet_aton的特殊处理并完成。

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

  • 可能表示IPv4或IPv6的h_addrtype。将其复制到sin_family
  • h_add_list中的实际地址。使用sin_addrmemcpy中给出的长度将其复制到h_length

这应该自动处理IPv4和IPv6。