我的代码应该检查getaddrinfo
找到的所有地址,并将第一个支持的协议存储在sockaddr
类型的变量中。但是,恰好addrinfo::ai_addrlen
字段大于sizeof(struct sockaddr)
,所以我不能只将它存储在堆栈上,或者我可以吗?在这里做什么是正确的,复制sizeof(struct sockaddr)
字节的内存并忽略其余的内容,或者在堆上分配struct sockaddr
实例,大小为addrinfo::ai_addrlen
?
答案 0 :(得分:4)
通常,您根本不会复制ai_addr
成员;您可以立即将其用作参数,以传递给bind
,connect
或getnameinfo
。如果您确实要复制它,则struct sockaddr_storage
类型的对象是合适的,但这通常是不好的做法。这是一个历史性的混乱,getaddrinfo
的目的很大一部分是通过不自己宣布这些类型来避免历史混乱。
答案 1 :(得分:0)
您可以根据家庭字段将addrinfo::ai_addr
强制转换为sockaddr_in
或sockaddr_in6
,然后sizeof将匹配。否则,您只能从addrinfo::ai_addrlen
开始写入addrinfo::ai_addr
个字节。