struct_sockaddr与struct_sockaddr_in

数据结构一:

struct sockaddr {

unsigned short sa_family;     /* address family, AF_xxx */

char sa_data[14];            /* 14 bytes of protocol address */

};

sa_family是地址家族,一般都是“AF_xxx”的形式。好像通常大多用的是都是AF_INETsa_data14字节协议地址。

此数据结构用做bindconnectrecvfromsendto等函数的参数,指明地址信息。

数据结构二:

但一般编程中并不直接针对此数据结构操作,而是使用另一个与sockaddr等价的数据结构

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 */

};

struct sin_addr {

unsigned long s_addr;

};

typedef struct sin_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;

sin_family指代协议族,在socket编程中只能是AF_INET。

sin_port存储端口号(使用网络字节顺序)。

sin_addr存储IP地址。

使用sin_zero是为了让sockaddrsockaddr_in两个数据结构保持大小相同而保留的空字节。

s_addr按照网络字节顺序存储IP地址。

sockaddr_insockaddr是并列的结构,指向sockaddr_in的结构体的指针也可以指向sockadd的结构体,并代替它。也就是说,你可以使用sockaddr_in建立你所需要的信息,在最后用进行类型转换就可以了bzero((char*)&mysock,sizeof(mysock));//初始化

mysock结构体名

mysock.sa_family=AF_INET;

mysock.sin_addr.s_addr=inet_addr("192.168.0.1");

……

等到要做转换的时候用:

struct sockaddr*mysock

sa_data的含义是由sa_family决定

如果sa_family=AF_INET

sa_data就是sockaddr_insin_addrsin_port 

换句话说,这时sockaddr可以当作sockaddr_inSockfd是调用socket函数返回的socket描述符,my_addr是个指向包含有本机IP地址及端口号等信息的sockaddr类型的指针;addrlen常被设置为sizeof(struct sockaddr)

你可能感兴趣的:(数据结构,编程,struct,socket,网络,存储)