1. 程式人生 > >socket中三種地址結構體的關係

socket中三種地址結構體的關係

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

說明:

sa_family:是2位元組的地址家族,一般都是“AF_xxx”的形式,它的值包括三種:AF_INETAF_INET6AF_UNSPEC

如果指定AF_INET,那麼函式就不能返回任何IPV6相關的地址資訊;如果僅指定了AF_INET6,則就不能返回任何IPV4地址資訊。

AF_UNSPEC則意味著函式返回的是適用於指定主機名和服務名且適合任何協議族的地址。如果某個主機既有

AAAA記錄(IPV6)地址,同時又有A記錄(IPV4)地址,那麼AAAA記錄將作為sockaddr_in6結構返回,而A記錄則作為sockaddr_in結構返回

通常用的都是AF_INET

struct sockaddr_in {
  short int sin_family; /* Address family */
  unsigned short int sin_port; /* Port number */
  struct in_addr sin_addr; /* Internet address */
  unsigned char sin_zero[8]; /* Same size as struct sockaddr */
  };

 sin_family:指代協議族,在socket程式設計中只能是AF_INET

  sin_port:儲存埠號(使用網路位元組順序)

  sin_addr:儲存IP地址,使用in_addr這個資料結構

  sin_zero:是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。

typedef struct in_addr {
  union {
  struct{ unsigned char s_b1,s_b2, s_b3,s_b4;} S_un_b;
  struct{ unsigned short s_w1, s_w2;} S_un_w;
  unsigned long S_addr;
  } S_un;
  } IN_ADDR;

闡述下in_addr的含義,很顯然它是一個儲存ip地址的共用體有三種表達方式:

第一種用四個位元組來表示IP地址的四個數字;

第二種用兩個雙位元組來表示IP地址;

第三種用一個長整型來表示IP地址。

給in_addr賦值的一種最簡單方法是使用inet_addr函式,它可以把一個代表IP地址的字串賦值轉換為in_addr型別,如addrto.sin_addr.s_addr=inet_addr("192.168.0.2");

其反函式是inet_ntoa,可以把一個in_addr型別轉換為一個字串。



Struct sockaddr_insockaddr指標強制轉換時sockaddr_in的sin_family對應struct sockaddr sa_family,struct sockaddr_in的sin_port、sin_addr、sin_zero[8]對應sockaddr sa_data[14]