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,代表TCP/IP協議族。
sa_data是14字節協議地址。
此數據結構用做bind、connect、recvfrom、sendto等函數的參數,指明地址信息。但一般編程中並不直接針對此數據結構操作,而是使用另一個與sockaddr等價的數據結構 SOCKADDR_IN。
sockaddr_in(在netinet/in.h中定義):
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 */
};
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;
struct { unsigned long S_addr; } S_un;
} IN_ADDR
#define s_addr S_un.S_addr /*can be used for most tcp &ip code*/
#define s_net S_un.S_un_b.s_b1 /*network*/
#define s_host S_un.S_un_b.s_b2 /*host on imp*/
#define s_lh S_un.S_un_b.s_b3 /*logical host*/
#define s_impno S_un.S_un_b.s_b4 /*imp #*/
#define s_imp S_un.S_un_w.s_w2 /*imp*/
sin_family指代協議族,在socket編程中只能是AF_INET
sin_port存儲端口號(使用網絡字節順序)
sin_addr存儲IP地址,使用in_addr這個數據結構
sin_zero是爲了讓sockaddr與sockaddr_in兩個數據結構保持大小相同而保留的空字節。
s_addr按照網絡字節順序存儲IP地址,
sockaddr_in和sockaddr是並列的結構,指向sockaddr_in的結構體的指針也可以指向sockaddr的結構體,並代替它。也就是說,你可以使用sockaddr_in建立你所需要的信息, 然後用進行類型轉換就可以了
bzero((char*)&mysock,sizeof(mysock));//初始化
sockaddr_in mysock;
bzero((char*)&mysock,sizeof(mysock));
mysock.sa_family=AF_INET;
mysock.sin_port=htons(1234);//1234是端口號
mysock.sin_addr.s_addr=inet_addr("192.168.0.1");
in_addr是一個聯合體。三個結構體S_un_b、S_un_w、S_un共用一個4字節內存區。
sin_addr.S_un.S_addr = (90<<24)|(25<<16)|(14<<8)|10 = 0x5a190e0a
也就是ip地址10.14.25.90。
90存在最高字節,25存在次高字節,14存在次低字節,10存在最低字節;
也就是
sin_addr.S_un_b.s_b1=10,
sin_addr.S_un_b.s_b2=14,
sin_addr.S_un_b.s_b3=25,
sin_addr.S_un_b.s_b4=90,
也就是
sin_addr.S_un_w.s_w1=(14<<8)|10=3594,
sin_addr.S_un_w.s_w2=(90<<24)|(25<<16)=23065。
也就是
sin_addr.s_addr=inet_addr("10.14.25.90");