2013-09-22 32 views
5

To jest internet (IPv4) struktura adres gniazda zdefiniowane w netinet/in.hJaka jest potrzeba oddzielnej struktury adresu w sockaddr_in?

struct sockaddr_in { 
    uint8_t   sin_len;  
    sa_family_t  sin_family; 
    in_port_t  sin_port;        
    struct in_addr sin_addr;         
    char   sin_zero[8]; 
}; 
struct in_addr { 
    in_addr_t s_addr;           
}; 

Oto co jest potrzeba oddzielnej struktury tylko na polu adresu.

Dlaczego nie możemy użyć następującej struktury?

struct sockaddr_in { 
    uint8_t   sin_len;  
    sa_family_t  sin_family; 
    in_port_t  sin_port;        
    in_addr_t  sin_addr;         
    char   sin_zero[8]; 
}; 

Odpowiedz

5

Jest to z przyczyn historycznych. We wczesnych dniach programowania gniazd, struct in_addr zawierał union różnych struktur, dzięki czemu można dostać się do poszczególnych bajtów. Ta union stała się zbędna, gdy pojawiły się podsieci i adresowania bezklasowe, ale wyłączenie struct dla prostego unsigned long spowodowałoby złamanie wielu kodów, więc tak pozostało.

Jeśli interesuje Cię programowanie sieciowe, a jeszcze nie dostałeś kopii UNIX Network Programming, gorąco polecam, to jest kopalnia złota na takie drobne szczegóły.

+0

Paul- Dzięki za książkę referencyjną +1 – sujin

+0

To wciąż jest związek w systemie Windows. – EJP