with socket programing program how example and linux sockets struct client-server systems-programming

socket - struct sockaddr_un v/s sockaddr-C(Linux)



socket server c example (2)

¿En qué se diferencia struct sockaddr de struct sockaddr_un ?

Sé que usamos estas estructuras en los módulos cliente-servidor, para unir el socket a la dirección del socket. Y utilizamos un operador de conversión para que acepte struct sockaddr_un.

Quiero saber qué tan diferentes / similares son, y por qué el operador de reparto?


"struct sockaddr" es una definición genérica. Es utilizado por cualquier función de socket que requiera una dirección.

"struct sockaddr_un" (una dirección de "sockets Unix") es un tipo específico de familia de direcciones.

La "estructura sockaddr_in" (una "dirección de conexión a Internet") más comúnmente vista es otro tipo específico de familia de direcciones.

El elenco es lo que permite que las API de sockets acepten un tipo de parámetro común que realmente será uno de varios tipos reales diferentes.

Aquí hay un buen enlace que muestra varias definiciones de familia de direcciones diferentes:

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


Por lo general, una struct sockaddr debería usarse solo como el tipo de base para un puntero. Es una estructura destinada a cubrir la secuencia inicial común de los miembros en los tipos de direcciones de sockets específicos de la familia de direcciones ( struct sockaddr_un , struct sockaddr_in , struct sockaddr_in6 etc.)

El único miembro en el que puede confiar es que struct sockaddr es un único sa_family_t , que indica la familia de direcciones del socket. La idea es que para obtener un tipo de polimorfismo, puede tener una función que pueda operar en diferentes tipos de direcciones de socket:

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 */ } /* ... */

Sin embargo, tenga en cuenta que, en general, se considera que el código como el anterior rompe la regla de "alias estricto" en C, si desea hacer eso en su propio código, se supone que debe usar un tipo de unión:

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 */ } /* ... */