sockaddr

sockaddr

一,用於存儲參與(IP)Windows套接字通信的計算機上的一個internet協定(IP)地址。為了統一地址結構的表示方法 ,統一接口函式,使得不同的地址結構可以被bind()、connect()、recvfrom()、sendto()等函式調用。但一般的編程中並不直接對此數據結構進行操作,而使用另一個與之等價的數據結構sockaddr_in。這是由於Microsoft TCP/IP套接字開發人員的工具箱僅支持internet地址欄位,而實際填充欄位的每一部分則遵循sockaddr_in數據結構,兩者大小都是16位元組,所以二者之間可以進行切換。

sockaddr

其定義如下:

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。

sockaddr_in

其定義如下:

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兩個數據結構保持大小相同而保留的空位元組。

而其中in_addr結構的定義如下:

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類型轉換為一個字元串。

相關詞條

相關搜尋

熱門詞條

聯絡我們