Sockets POSIX插座;从结构中的sockaddr_解密主机名

Sockets POSIX插座;从结构中的sockaddr_解密主机名,sockets,posix,Sockets,Posix,在结构中给定sockaddru,是否可以破译主机名 struct sockaddr_in { short sin_family; // e.g. AF_INET, AF_INET6 unsigned short sin_port; // e.g. htons(3490) struct in_addr sin_addr; // see struct in_addr, below char si

在结构中给定sockaddru,是否可以破译主机名

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};
我试着打印出“udp\u server.sin\u addr.s\u addr”(其中udp\u server的类型为struct sockaddr\u in),然后它给我打印了一个数字。


我相信s_addr变量已转换为网络长?如何将其转换为可读格式,以便确定主机?

有许多函数可用于将您提到的数字(长格式的网络地址)转换为人类可读的地址

查看
inet\u pton()
inet\u ntop()
(演示文稿到数字,数字到演示文稿)。这些都是特定于网络的,如果我没有弄错的话,它们适用于IPv4和IPv6


苏尔特

是的,它是按网络字节顺序排列的IP地址。使用或返回IP的字符串表示形式。

但是请注意,这会生成人类可读的IP地址,而不是主机名。要恢复主机名,如果您只有一个套接字地址,则必须执行反向DNS查找(例如,使用
getnameinfo
),但这不能保证为您提供任何有用的信息。(例如,这就是为什么HTTP/1.1要求客户机告诉服务器它认为它正在与哪个主机名进行通信,作为应用层数据的原因。)