我如何知道string
是canonical 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;
答案 0 :(得分:3)
熟悉可以执行任何操作的getaddrinfo(3)
,并且还支持IPv6。
答案 1 :(得分:1)
为什么要模糊? gethostbyname
已经解决了这个问题。引用manual:
[...] name是主机名或IPv4 标准点表示法(对于inet_addr(3))或IPv6 以冒号(可能是点)表示的地址。
所以删除inet_aton
的特殊处理并完成。
关于XYZ
部分:hostent
结构包含您必须复制到in_addr
的两件事:
h_addrtype
。将其复制到sin_family
。h_add_list
中的实际地址。使用sin_addr
和memcpy
中给出的长度将其复制到h_length
。 这应该自动处理IPv4和IPv6。