您的位置:首页 > 其它

sockaddr与sockaddr_in,sockaddr_un结构体详细讲解

2012-12-06 12:54 411 查看
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。

sa_data是14字节协议地址。

此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。

但一般编程中并不直接针对此数据结构操作,而是使用另一个与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 in_addr {

unsigned long s_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;

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的结构体的指针也可以指向

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

添加点关于sockaddr_un结构体的介绍:

sockaddr_un

Unix socket address record.
Declaration

Source position: socketsh.inc line 152

typesockaddr_un=packed record

   sun_family:sa_family_t;//sa_family_t的类型是WORD,即unsiged short

Address family

   sun_path:array[0..107]ofChar;

File name

end;

Description

sockaddr_unis used to store a UNIX socket addres for the Bind, Recv and Send calls.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: