web-dev-qa-db-fra.com

Pourquoi sin_addr est-il dans la structure in_addr?

Mon doute est lié à la structure suivante des sockets sous UNIX:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    struct in_addr   sin_addr;     // see struct in_addr, below
    char             sin_zero[8];  // zero this if you want to
};

Ici le membre sin_addr est de type struct in_addr.

Mais je ne comprends pas pourquoi quelqu'un voudrait faire ça comme tout struct inaddr has est:

struct in_addr {
    unsigned long s_addr;          // load with inet_pton()
};

Tout in_addr a un seul membre s_addr. Pourquoi ne pouvons-nous pas avoir quelque chose comme ça:

struct sockaddr_in {
    short            sin_family;   // e.g. AF_INET, AF_INET6
    unsigned short   sin_port;     // e.g. htons(3490)
    unsigned long    s_addr ; 
    char             sin_zero[8];  // zero this if you want to
};
50
Deepankar Bajpeyi

struct in_addr est parfois très différent de cela, selon le système sur lequel vous vous trouvez. Sur Windows par exemple:

typedef struct in_addr {
  union {
    struct {
      u_char s_b1,s_b2,s_b3,s_b4;
    } S_un_b;
    struct {
      u_short s_w1,s_w2;
    } S_un_w;
    u_long S_addr;
  } S_un;
} IN_ADDR, *PIN_ADDR, FAR *LPIN_ADDR;

La seule exigence est qu'elle contienne un membre s_addr.

29
Carl Norum

Parce que le in_addr la structure peut contenir plusieurs membres.

http://pubs.opengroup.org/onlinepubs/009604599/basedefs/netinet/in.h.html

8
ouah

struct in_addr est plus qu'un simple entier car il peut avoir plus de in_addr_t. Dans de nombreux systèmes, il a un union, et la raison d'une telle implémentation est pour adresses de classe A/B/C , qui ne sont pas utilisées actuellement.

Unix Network Programming Volume 1 explique la raison historique en détail:

La raison pour laquelle le sin_addr membre est une structure, et pas seulement un in_addr_t, est historique. Les versions antérieures (4.2BSD) définissaient le in_addr structure en tant que union de diverses structures, pour permettre l'accès à chacun des 4 octets et aux deux valeurs 16 bits contenues dans l'adresse IPv4 32 bits. Cela a été utilisé avec les adresses de classe A, B et C pour récupérer les octets appropriés de l'adresse. Mais avec l'avènement du sous-réseau puis la disparition des différentes classes d'adresses avec l'adressage sans classe, le besoin d'union a disparu. Aujourd'hui, la plupart des systèmes ont supprimé le union et se contentent de définir in_addr en tant que structure avec un seul in_addr_t membre.

7
Yu Hao