![](/img/trans.png)
[英]What is the difference between struct addrinfo and struct sockaddr
[英]What to do when `addrinfo::ai_addrlen` is larger than `sizeof(struct sockaddr)`?
我的代碼應檢查getaddrinfo
找到的所有地址,並將第一個帶有受支持協議的地址存儲在sockaddr
類型變量中。 但是,碰巧addrinfo::ai_addrlen
字段大於sizeof(struct sockaddr)
,所以我不能只將其存儲在堆棧中,還是可以嗎? 在這里要做的正確的事情是,復制內存的sizeof(struct sockaddr)
個字節並忽略其余字節,或者在堆上分配大小為addrinfo::ai_addrlen
的struct sockaddr
實例?
通常,您根本不會復制ai_addr
成員。 您立即將其用作傳遞bind
, connect
或getnameinfo
。 如果確實要復制它,則使用struct sockaddr_storage
類型的對象是合適的,但這通常是一種不好的做法。 這全都是歷史混亂, getaddrinfo
的大部分目的是通過不自己聲明此類類型來避免歷史混亂。
您可以根據家庭字段將addrinfo::ai_addr
為sockaddr_in
或sockaddr_in6
,然后sizeof將匹配。 否則,你可以只寫addrinfo::ai_addrlen
字節開始在addrinfo::ai_addr
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.