2013-09-22 24 views
5

Questa è la struttura indirizzo di socket Internet (IPv4) definita in netinet/in.hQual è la necessità di una struttura di indirizzi separata in 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;           
}; 

Ecco che cosa è la necessità di struttura separata solo per il campo indirizzo.

Perché non possiamo usare la seguente struttura?

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]; 
}; 

risposta

5

È per motivi storici. Nei primi giorni della programmazione dei socket, struct in_addr conteneva uno union di varie strutture in modo da poter ottenere i singoli byte. Questo union non è più necessario quando si è verificata la sottorubrificazione e l'indirizzamento senza classi, ma il passaggio allo struct per un semplice unsigned long interromperebbe un sacco di codice, quindi è rimasto invariato.

Se sei interessato alla programmazione di rete e non hai ancora preso una copia di UNIX Network Programming allora ti consiglio vivamente di farlo, è una miniera d'oro per piccoli dettagli come questo.

+0

Paul- Grazie per il libro di riferimento +1 – sujin

+0

È ancora un'unione in Windows. – EJP