2014-09-21 37 views
1

getaddrinfo()填充struct addrinfo其中實際打包地址存儲在struct sockaddr *ai_addr字段中。 struct sockaddr具有實際的二進制地址表示的字段char *sa_data。我想將這個sa_data複製到另一個使用memcpy()的變量,爲此我需要知道該字段的實際長度。如何獲取getaddrinfo返回的ai_addr-> sa_data的實際大小()

我覺得ai_addrlen是我需要的。但事實上,IPv4返回16,IPv6返回28。我想太多了。那麼,獲得sa_data長度的最正確方法是什麼?可能是length = sa_family == AF_INET ? 4 : 16length = ai_addrlen - 12

回答

3

getaddrinfo()函數返回由struct addrinfo記錄組成的鏈表。這些記錄中的每一個都包含一個指向struct sockaddr的指針,它是一個多態類型,其後面實際上有一個struct sockaddr_instruct sockaddr_in6ai_addrlen會員告訴你該結構有多大,即返回sizeof (struct sockaddr_in)sizeof (struct sockaddr_in6)

這些結構包含二進制IP地址,端口號(用於TCP或UDP等傳輸協議),家庭(在struct addrinfo中也重複)以及其他數據(用於IPv6的flowinfo和scope_id) )。

實際的二進制地址位於struct sockaddr_instrict sockaddr_in6內,分別爲struct in_addr sin_addrstruct in6_addr sin6_addr。您可以使用這些字段或類型來確定大小。

length = sa_family == AF_INET ? sizeof (struct in_addr) : sizeof (struct in6_addr) 

由於這些是已知的數字,你當然可以使用你已經在你的問題。

length = sa_family == AF_INET ? 4 : 16 

但你也試着做ai_addrlen算術,這是不是一個好主意,因爲類型可以通過操作系統和變化有一個在沒有邏輯反正。如果您有特定用例或特定代碼,我可以添加更多詳細信息。

+0

謝謝澄清! – 2014-09-21 12:56:42

相關問題