Прототип getnameinfo запрашивает sockaddr, а не sockaddr_in? - PullRequest
4 голосов
/ 05 апреля 2010

Прототип getnameinfo запрашивает sockaddr, но я видел только примеры использования sockaddr_in. Можно ли переписать этот пример для sockaddr? sin_family становится sa_family, но как насчет sin_port и sin_addr? Как они включены в sa_data?

<code>
struct sockaddr{
    unsigned short  sa_family;
    char            sa_data[14];
};</p>

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

<h2>

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);

1 Ответ

4 голосов
/ 05 апреля 2010

struct sockaddr является «суперклассом» конкретных адресных структур протокола, таких как struct sockaddr_in, struct sockaddr_in6, struct sockaddr_un и т. Д. getnameinfo(3) отправляет в определенный путь выполнения на основе семейства адресов (sa_family член.)

Что касается памяти - три члена struct sockaddr_in перекрываются с struct sockaddr sa_data. Взгляните на главу 3 книги UnP .

...