25 c sockets networking
根据我的理解,struct addrinfo用于准备套接字地址结构,struct sockaddr包含套接字地址信息.但这究竟意味着什么呢?struct addrinfo包含指向struct sockaddr的指针.为什么要将它们分开?为什么我们不能将sockaddr中的所有内容组合到addr_info中?
我只是在这里猜测,但他们分离的原因是为了在传递结构时节省空间?例如,在bind()调用中,它需要的只是端口号和Internet地址.所以这两个都分组在struct sockaddr中.那么,我们可以传递这个小结构而不是更大的结构addrinfo?
struct addrinfo {
int ai_flags; // AI_PASSIVE, AI_CANONNAME, etc.
int ai_family; // AF_INET, AF_INET6, AF_UNSPEC
int ai_socktype; // SOCK_STREAM, SOCK_DGRAM
int ai_protocol; // use 0 for "any"
size_t ai_addrlen; // size of ai_addr in bytes
struct sockaddr *ai_addr; // struct sockaddr_in or _in6
char *ai_canonname; // full canonical hostname
struct addrinfo *ai_next; // linked list, next node
};
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
Run Code Online (Sandbox Code Playgroud)
Cro*_*man 17
struct addrinfo
getaddrinfo()
成功返回并包含struct
指定主机名和/或服务的此类s 的链接列表.
该ai_addr
成员实际上不是一个struct sockaddr
,因为它struct
只是一个包含所有其他成员的通用成员的通用成员,用于确定您实际拥有的结构类型.根据您传递给的内容getaddrinfo()
以及该函数发现的内容,ai_addr
实际上可能是指向struct sockaddr_in
或struct sockaddr_in6
,或其他任何内容的指针,具体取决于适合该特定地址条目的内容.这是他们保持"分离"的一个很好的理由,因为该成员可能指向一堆不同类型的struct
s中的一个,如果你试图将所有成员硬编码,它就无法做到struct addrinfo
,因为那些不同的struct
s有不同的成员.
如果您有主机名,这可能是获取此信息的最简单方法,但这不是唯一的方法.对于IPv4连接,您可以struct sockaddr_in
自己填充结构,如果您愿意,并且您有数据要这样做,并且避免经历调用的严格要求getaddrinfo()
,如果需要进入调用,您可能需要等待.互联网为您收集信息.您根本不必使用struct addrinfo
.
归档时间: |
|
查看次数: |
20893 次 |
最近记录: |