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

W tej strukturze co dokładnie oznacza "rodzina adresów" przedstawiona przez "sa_family"?Rozumienie struct sockaddr

Czy oznacza to, że protokoły takie jak TCP/UDP mają "adresy"? Cóż, protokoły mogą być numerami identyfikacyjnymi, a nie adresami.

W każdym razie, jeśli tak, to na jakiej podstawie podzielono ich rodziny?

Odpowiedz

18

Format i rozmiar adresu jest zwykle zależny od protokołu.

sockaddr służy jako podstawa zestawu struktur adresowych, które działają jak unia dyskryminowana, patrz: http://www.retran.com/beej/sockaddr_inman.html. Generalnie patrzysz na sa_family, a następnie rzutujesz na odpowiednią strukturę adresów odpowiedniej rodziny adresów.

TCP i UDP nie mają adresy specyficzne dla nich jako takie, a poziom IP ma różne rozmiary adres dla IPv4 i IPv6.

Zobacz także:

+0

Dzięki, ale dlaczego w tym przypadku rozmiar adresu * jest ustawiony * 14 'sa_data [14]'? –

+0

, a także, jeśli rozmiar jest zależny od typu protokołu, to co należy ustawić tam jako ogólny przypadek, jeśli protokół można określić w czasie wykonywania? –

+1

Zobacz http://msdn.microsoft.com/en-us/library/ff570822%28v=vs.85%29.aspx. Stwierdza, że ​​struktura sockaddr jest wystarczająco duża, aby zawierać adres transportowy dla większości rodzin adresów. Tak więc jest to 14 bajtów, aby było wystarczająco duże. –

0

Znalazłem to, gdy próbuje powielać metody w C/C jnetpcap getHardwareAddress (++). Adres MAC jest zawarty, gdy sa_family ma 17 (0x11, AF_PACKET), w bajtach 10-15.

Powiązane problemy