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");