簡體   English   中英

規范名稱或IP地址-套接字,Linux和C

[英]Canonical name or IP address - socket, linux and C

我怎么知道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;

熟悉既可以執行又支持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的實際地址。 使用memcpyh_length給定的長度將其復制到sin_addr中。

這應該同時自動處理IPv4和IPv6。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM