структура sockaddr_un против sockaddr - PullRequest
29 голосов
/ 11 сентября 2010

Чем struct sockaddr отличается от struct sockaddr_un?

Я знаю, что мы используем эти структуры в клиент-серверных модулях для привязки сокета к адресу сокета. И мы используем оператор приведения для принятия struct sockaddr_un.

Я хочу знать, насколько они различны / похожи, и почему оператор приведения?

Ответы [ 2 ]

29 голосов
/ 11 сентября 2010

"struct sockaddr" - это общее определение. Он используется любой функцией сокета, для которой требуется адрес.

"struct sockaddr_un" (адрес "сокетов Unix") - это определенный тип семейства адресов.

Наиболее часто встречающийся "struct sockaddr_in" (адрес "интернет-сокета") - это другой специфический тип семейства адресов.

Приведение - это то, что позволяет API-интерфейсам сокетов принимать общий тип параметра, который фактически будет любым из нескольких различных фактических типов.

Вот хорошая ссылка, которая показывает несколько разных определений семейства адресов:

http://www.cas.mcmaster.ca/~qiao/courses/cs3mh3/tutorials/socket.html

23 голосов
/ 11 сентября 2010

A struct sockaddr обычно следует использовать только в качестве базового типа для указателя.Это структура, предназначенная для охвата общей начальной последовательности элементов в типах адресов сокетов, специфичных для семейства адресов (struct sockaddr_un, struct sockaddr_in, struct sockaddr_in6 и т.на struct sockaddr имеется один sa_family_t, указывающий семейство адресов сокетов.Идея состоит в том, чтобы получить своего рода полиморфизм - у вас может быть функция, которая может работать с несколькими различными типами адресов сокетов:

void foo(struct sockaddr *sa)
{
    switch(sa->sa_family)
    {
    case AF_INET: {
        struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;

        /* AF_INET processing */
    }

    case AF_UNIX: {
        struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;

        /* AF_UNIX processing */
    }

/* ... */

Обратите внимание, что такой код, как указано выше, обычно считается нарушающимпсевдоним "правило в C - если вы хотите сделать это в своем собственном коде, вы должны использовать тип объединения:

union sockaddr {
    struct sockaddr sa;
    struct sockaddr_in sin;
    struct sockaddr_un sun;
    /* ... */
};

void foo(union sockaddr *sa_union)
{
    struct sockaddr *sa = (struct sockaddr *)sa_union;

    switch(sa->sa_family)
    {
    case AF_INET: {
        struct sockaddr_in *sa_in = (struct sockaddr_in *)sa;

        /* AF_INET processing */
    }

    case AF_UNIX: {
        struct sockaddr_un *sa_un = (struct sockaddr_un *)sa;

        /* AF_UNIX processing */
    }

/* ... */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...