12
struct sockaddr { 
    unsigned short sa_family; // address family, AF_xxx 
    char   sa_data[14]; // 14 bytes of protocol address 
}; 

En esta estructura, ¿qué significa exactamente "familia de direcciones" representado por "sa_family"?Comprender struct sockaddr

¿Significa que los protocolos como TCP/UDP tienen "direcciones"? Bueno, los protocolos pueden ser números de identificación, no direcciones, creo.

De todos modos, en caso afirmativo, ¿sobre qué base se han dividido sus familias?

Respuesta

18

El formato y el tamaño de la dirección suelen ser específicos del protocolo.

sockaddr se utiliza como la base de un conjunto de estructuras de direcciones que actúan como una unión discriminada, consulte http://www.retran.com/beej/sockaddr_inman.html. Por lo general, mira sa_family y luego lo envía a la estructura de direcciones específica de la familia de direcciones apropiada.

TCP y UDP no tienen direcciones específicas para ellos como tales, más bien el nivel de IP tiene diferentes tamaños de dirección para IPv4 e IPv6.

Consulte también:

+0

Gracias, pero ¿por qué en este caso el tamaño de la dirección es * fijo * 14 'sa_data [14]'? –

+0

y también, si el tamaño depende del tipo de protocolo, ¿qué se debe establecer allí como un caso general si el protocolo se puede decidir en tiempo de ejecución? –

+1

Ver http://msdn.microsoft.com/en-us/library/ff570822%28v=vs.85%29.aspx. Establece que la estructura sockaddr es lo suficientemente grande como para contener una dirección de transporte para la mayoría de las familias de direcciones. Entonces son 14 bytes para que sea lo suficientemente grande. –

0

descubrí esto cuando se trata de duplicar el método jnetpcap getHardwareAddress() en C/C++. La dirección MAC está contenida, cuando sa_family es 17 (0x11, AF_PACKET), en bytes 10-15.