[英]Canonical name or IP address - socket, linux and C
我怎么知道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;
熟悉既可以執行又支持IPv6的getaddrinfo(3)
。
為什么要起毛? gethostbyname
已經解決了這一問題。 引用手冊 :
名字是主機名,或者是標准點表示法中的IPv4地址(如inet_addr(3)一樣),或者是冒號(可能還有點)中的IPv6地址。
因此,刪除具有inet_aton
的特殊處理inet_aton
完成。
關於XYZ
部分: hostent
結構包含必須復制到in_addr
中的兩件事:
h_addrtype
,可能表示IPv4或IPv6。 將其復制到sin_family
。 h_add_list
的實際地址。 使用memcpy
和h_length
給定的長度將其復制到sin_addr
中。 這應該同時自動處理IPv4和IPv6。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.