我想知道是否有人知道结构addrinfo的定义(标题?)。它似乎用于套接字编程,但我从来没有看到它声明。我只看到随机使用的struct addrinfo *head;
之类的东西,但从未声明过addrinfo。
然后,在其中(在addrinfo中)有一个数据类型'socklen_t'
。这是一种数据类型,究竟是什么?
同样在其中有struct addrinfo *ai_next
令我惊讶:因为什么是有用的?在我的理解中,addrinfo存储有关如何连接另一个套接字的信息,struct sockaddr *ai_addr
存储一个人希望连接的确切地址(即TCP / IP时的IP号和端口号)。
所以说,我不应该只需要一个addrinfo结构,那个存储我想要的连接数据的结构?为什么还有更多?
然后:getaddrinfo
的最后一个论点是什么?它被称为struct addrinfo **res
,但我无法弄清楚,那可能是什么。
请允许我最后一个,这对你们来说可能很容易:
struct addrinfo hints = {
.ai_flags = AI_ADDRCONFIG,
.ai_socktype = SOCK_STREAM,
.ai_family = PF_UNSPEC
};
我说的是正确的,提示是addrinfo类型的另一个结构和符号:
.ai_flags = AI_ADDRCONFIG,
实际上是简称:
struct addrinfo hints;
hints.ai_flags = AI....
伙计们让我读你所知道的! 爱与爱尊重你们所有人
答案 0 :(得分:0)
addrinfo结构如下所示:
struct addrinfo {
int ai_flags;
int ai_family;
int ai_socktype;
int ai_protocol;
socklen_t ai_addrlen;
struct sockaddr *ai_addr;
char *ai_canonname;
struct addrinfo *ai_next;
};
来源:http://man7.org/linux/man-pages/man3/getaddrinfo.3.html
socklen_t
是int的typedef。
typedef _U32_TYPE int;
...
typedef socklen_t _U32_TYPE;
来源:https://fossies.org/dox/glibc-2.24/bits_2types_8h.html
ai_next
用于创建链接列表。我并不完全知道如何使用这种结构,但我认为您可能希望连接到多个套接字,而不仅仅是一个。
getaddrinfo()函数分配并初始化addrinfo结构的链接列表,每个网络地址对应一个节点和服务,受到提示施加的任何限制,并返回指向res中列表开头的指针。
因此,在致电getaddrinfo()
后,*res
将成为您的链接列表的第一个元素。
最后,我不确定你的语法是否正确,但这个是正确的:
struct addrinfo hints = {
.ai_flags = AI_ADDRCONFIG,
.ai_socktype = SOCK_STREAM,
.ai_family = PF_UNSPEC
};
当你这样做时,你直接初始化这些成员,当你这样做时:
struct addrinfo hints;
hints.ai_flags = AI_ADDRCONFIG;
hints.ai_socktype = SOCK_STREAM;
hints.ai_family = PF_UNSPEC;
您创建了您的结构(其中包含未定义的内容),并初始化成员。
所以结果是一样的,但内存中的行为有点不同。