关于,, addrinfo"的一些信息;在c?

时间:2016-10-31 14:44:20

标签: c sockets

我想知道是否有人知道结构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....

伙计们让我读你所知道的! 爱与爱尊重你们所有人

1 个答案:

答案 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;

您创建了您的结构(其中包含未定义的内容),并初始化成员。

所以结果是一样的,但内存中的行为有点不同。

相关问题