1. 程式人生 > >sockaddr_in中sin_zero的意義,以及sockaddr_in sockaddr in_addr區別聯絡

sockaddr_in中sin_zero的意義,以及sockaddr_in sockaddr in_addr區別聯絡

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

sa_family是地址家族,是“AF_xxx”的形式。常設為“AF_INET”,代表Internet(TCP/IP)地址族。

sa_data是協議地址,由sa_family決定。如果sa_family=AF_INET,則sa_data就是sockaddr_in的sin_addr和sin_port。換句話說,這時sockaddr可以當作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
};

struct in_addr {
unsigned long s_addr; // that’s a 32-bit long, or 4 bytes
};[::備註1]

sin_family意義與sa_family同。

sin_port儲存埠號(使用網路位元組順序)
sin_addr儲存IP地址,使用in_addr這個資料結構
sin_zero是為了讓sockaddr與sockaddr_in兩個資料結構保持大小相同而保留的空位元組。
在 in_addr結構體中,s_addr按照網路位元組順序儲存IP地址。

sin_zero用來將sockaddr_in結構填充到與struct sockaddr同樣的長度,可以用bzero()或memset()函式將其置為零。指向sockaddr_in的指標和指向sockaddr的指標可以相互轉換,這意味著如果一個函式所需引數型別是sockaddr型別時,你可以在函式呼叫的時候將一個指向sockaddr_in的指標轉換為指向sockaddr的指標;或者相反。


想來你是要進行網路程式設計,使用socket, listen, bind等函式。你只要記住,填值的時候使用sockaddr_in結構,而作為函式的引數傳入的時候轉換成sockaddr結構就行了,畢竟都是16個字元
長。 [::備註1]

/*實際上在Winsock2.h中檢視in_addr*/

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;
#define s_addr  S_un.S_addr
                                /* can be used for most tcp & ip code */
#define s_host  S_un.S_un_b.s_b2
                                /* host on imp */
#define s_net   S_un.S_un_b.s_b1
                                /* network */
#define s_imp   S_un.S_un_w.s_w2
                                /* imp */
#define s_impno S_un.S_un_b.s_b4
                                /* imp # */
#define s_lh    S_un.S_un_b.s_b3
                                /* logical host */
};

***************************/