getnameinfo 原型要求 sockaddr 而不是 sockaddr_in?

Jan*_*ane 4 c sockets ip struct hostname

getnameinfo 原型要求sockaddr但我只看到使用的示例sockaddr_in。这个例子可以重写吗sockaddr?sin_family 变成了sa_family,但是 sin_port 和 呢sin_addr?它们是如何包含在 中的sa_data

struct sockaddr{
    unsigned short  sa_family;
    char            sa_data[14];
};

struct sockaddr_in{
    short           sin_family;
    unsigned short  sin_port;
    struct in_addr  sin_addr;
    char            sin_zero[8];
};


struct sockaddr_in sin;
memset(&sin, 0, sizeof(sin));
sin.sin_family      = AF_INET;
sin.sin_addr.s_addr = inet_addr(IPvar);
sin.sin_port        = 0; // If 0, port is chosen by system

getnameinfo( (struct sockaddr *)&sin, sizeof(sin), buffervar, sizeof(buffervar), NULL, 0, 0);
Run Code Online (Sandbox Code Playgroud)

Nik*_*sov 5

struct sockaddr是具体协议地址结构的“超类”,例如struct sockaddr_instruct sockaddr_in6、 和struct sockaddr_un等。getnameinfo(3)根据地址族(sa_family成员)分派到特定的执行路径。

就记忆而言 - 的三个成员与成员struct sockaddr_in重叠。看看UnP 书的第 3 章。struct sockaddrsa_data