簡體   English   中英

當`addrinfo :: ai_addrlen`大於`sizeof(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_addrlenstruct sockaddr實例?

通常,您根本不會復制ai_addr成員。 您立即將其用作傳遞bindconnectgetnameinfo 如果確實要復制它,則使用struct sockaddr_storage類型的對象是合適的,但這通常是一種不好的做法。 這全都是歷史混亂, getaddrinfo的大部分目的是通過不自己聲明此類類型來避免歷史混亂。

您可以根據家庭字段將addrinfo::ai_addrsockaddr_insockaddr_in6 ,然后sizeof將匹配。 否則,你可以只寫addrinfo::ai_addrlen字節開始在addrinfo::ai_addr

暫無
暫無

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

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