¿Por qué struct sockaddr
contiene un campo de familia de direcciones? ¿Ya no está arreglada la familia de direcciones con la llamada al socket()
?¿Por qué `struct sockaddr` contiene un campo de familia de direcciones?
Respuesta
sockaddr
se utiliza en otros lugares además de connect
y bind
, incluyendo los lugares en los que no tienen algún conocimiento externo de la familia de direcciones involucrados - getaddrinfo
ser uno.
Además, aunque no creo que lo siguiente sea equivalente a practicar en cualquier lugar, puedo ver que ha estado en el ojo de quien diseñó esto originalmente: la llamada a socket()
define la familia de protocolos. sockaddr
contiene la familia de direcciones. En la práctica, creo que estos son siempre los mismos, pero teóricamente podría tener un protocolo capaz de soportar dos tipos de direcciones diferentes.
EDITAR: Hay otra forma en que el parámetro es útil. Si está utilizando sockets de datagramas (UDP) y tiene un socket en un estado "conectado" con una dirección de destino predeterminada, puede clear out that address llamando al connect()
con sockaddr
con sa_family
con AF_UNSPEC
.
Hmm ... +1 para "más lugares" y la teoría PF contra AF, pero 'struct sockaddr' es anterior a' getaddrinfo' por al menos 15 años. –
larsmans, he agregado un lugar que usa el parámetro y donde los métodos en cuestión han existido siempre y cuando 'struct sockaddr'. Aunque no sé si esa funcionalidad específica ha durado tanto. Aparte de ese lugar, no sé de nada más que realmente necesite a la familia y que haya existido siempre y cuando 'struct sockaddr' sí lo haya hecho. –
El campo sa_family se usa para indicar qué tipo de dirección será en el campo sa_data. En muchas aplicaciones, se supone que la familia de direcciones es IPV4. Sin embargo, muchas aplicaciones también son compatibles con IPV6.
Pero incluso para IPv6, la familia de direcciones ya está configurada en la llamada a socket(), ¿no es así? – mdm
Si observas la interfaz getaddrinfo
, que es la única forma correcta y moderna de convertir entre representaciones de intercambio de direcciones (nombres o direcciones numéricas) y las estructuras sockaddr
, creo que verás por qué es necesaria.
Dicho esto, todo el material de struct sockaddr
es un gran desastre de diseños erróneos, especialmente la conversión endian del espacio de usuario.
Otra buena instancia de por qué se necesita el campo sa_family
es getsockname
y getpeername
interfaces. Si el programa heredó el descriptor de archivo de otro programa y aún no sabe qué tipo de socket es, debe poder determinarlo para realizar nuevas conexiones o incluso convertir la dirección en una representación adecuada para el intercambio.
@R: esto también es importante para los sockets de servidores de doble pila IPv4/IPv6 para detectar si un cliente IPv4 o IPv6 está conectado. –
Si mira el código de red 4.2BSD, donde se originó la interfaz de los sockets, verá que el sockaddr
se pasa a los controladores de la interfaz de red pero el socket fd no.
- 1. Comprender struct sockaddr
- 2. struct sockaddr_un v/s sockaddr - C (Linux)
- 3. Por qué podemos lanzar sockaddr a sockaddr_in
- 4. ¿Por qué se firma el campo st_size en struct stat?
- 5. programación de red: función de socket: familia de direcciones Vs familia de protocolos
- 6. familia de direcciones no es compatible con la familia de protocolo
- 7. ¿Tiene struct hostent un campo "h_addr"?
- 8. Android 2.2 y "familia de direcciones incorrectas" en Socket Connect
- 9. ¿Por qué necesitamos struct? (C#)
- 10. ¿Por qué apache mantiene desplazamientos en la memoria donde php-cli contiene direcciones de memoria virtual?
- 11. OpenCL struct argumento espacio de direcciones no válido
- 12. Usando reflect, ¿cómo establece el valor de un campo struct?
- 13. ¿Por qué sizeof parse struct members?
- 14. typedef struct y enum, ¿por qué?
- 15. ¿Por qué un campo de 8 bits tiene endianness?
- 16. Cómo obtener la dirección IP de sockaddr
- 17. ¿Por qué es mejor struct con menos de 16 bytes?
- 18. En C++, ¿por qué struct es, de hecho, clase?
- 19. Familia de columnas Hbase
- 20. DEBUG/SntpClient (60): tiempo de solicitud fallido: java.net.SocketException: familia de direcciones no compatible con el protocolo
- 21. ¿Por qué la adición de un índice a un campo de base de datos acelera la búsqueda en ese campo?
- 22. Columna dividida que contiene las direcciones de correo electrónico
- 23. ¿Por qué las direcciones de función no son expresiones constantes?
- 24. Restricción ÚNICA, solo cuando un campo contiene un valor específico
- 25. ¿Qué contiene un marco de audio?
- 26. C# ¿por qué necesita struct si la clase puede cubrirlo?
- 27. C struct ++ que contiene unsigned char e int fallo
- 28. ¿Cómo comprobar que un ResultSet contiene un campo específicamente nombrado?
- 29. Nivel de protección de un campo struct dentro de una clase
- 30. Por qué struct no puede tener el constructor sin parámetros
Supongo que el kernel solo enruta la llamada en función de la familia proporcionada en bind. Supongo que cada familia correspondería a un módulo kernel diferente. –