views:

183

answers:

2

How is struct sockaddr different from struct struct sockaddr_un ?

I know that we use these structures in client-server modules,for binding the socket to the socket address.And we use a cast operator for it to accept struct sockaddr_un.

I want to know how different/similar are they,and why the cast operator?

+3  A: 

"struct sockaddr" is a generic definition. It's used by any socket function that requires an address.

"struct sockaddr_un" (a "Unix sockets" address) is a specific kind of address family.

The more commonly seen "struct sockaddr_in" (an "Internet socket" address) is another specific kind of address family.

The cast is what allows the sockets APIs to accept a common parameter type that will actually be any one of several different actual types.

Here's a good link that shows several different address family definitions:

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

+2  A: 

A struct sockaddr should generally only be used as the base type for a pointer. It is a structure intended to cover the common initial sequence of the members in the address family specific socket address types (struct sockaddr_un, struct sockaddr_in, struct sockaddr_in6 etc.)

The only member that you can rely on struct sockaddr having is a single sa_family_t, indicating the socket address family. The idea is that to obtain a sort of polymorphism - you can have a function that can operate on several different socket address types:

void foo(struct sockaddr *sa)
{
    switch(sa->sin_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 */
    }

/* ... */
caf
@caf--Thank you
Pavitar