当`addrinfo :: ai_addrlen`大于`sizeof(struct sockaddr)`时该怎么办?

时间:2013-12-02 06:39:47

标签: c sockets

我的代码应该检查getaddrinfo找到的所有地址,并将第一个支持的协议存储在sockaddr类型的变量中。但是,恰好addrinfo::ai_addrlen字段大于sizeof(struct sockaddr),所以我不能只将它存储在堆栈上,或者我可以吗?在这里做什么是正确的,复制sizeof(struct sockaddr)字节的内存并忽略其余的内容,或者在堆上分配struct sockaddr实例,大小为addrinfo::ai_addrlen

2 个答案:

答案 0 :(得分:4)

通常,您根本不会复制ai_addr成员;您可以立即将其用作参数,以传递给bindconnectgetnameinfo。如果您确实要复制它,则struct sockaddr_storage类型的对象是合适的,但这通常是不好的做法。这是一个历史性的混乱,getaddrinfo的目的很大一部分是通过不自己宣布这些类型来避免历史混乱。

答案 1 :(得分:0)

您可以根据家庭字段将addrinfo::ai_addr强制转换为sockaddr_insockaddr_in6,然后sizeof将匹配。否则,您只能从addrinfo::ai_addrlen开始写入addrinfo::ai_addr个字节。