整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详

sockaddr

 

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

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*)mysocksocket

 

sockaddr_un

 

进程间通讯的一种方式是使用UNIX套接字,人们在使用这种方式时每每用的不是网络套接字,而是一种称为本地套接字的方式。这样作能够避免为黑客留下后门。函数

建立
使用套接字函数socket建立,不过传递的参数与网络套接字不一样。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通信类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:
 int sockfd;
 sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);spa

绑定
建立了套接字后,还必须进行绑定才能使用。不一样于网络套接字的绑定,本地套接字的绑定的是struct sockaddr_un结构。struct sockaddr_un结构有两个参数:sun_family、sun_path。sun_family只能是AF_LOCAL或AF_UNIX,而 sun_path是本地文件的路径。一般将文件放在/tmp目录下。例如:指针

struct sockaddr_un sun;
 sun.sun_family = AF_LOCAL;
 strcpy(sun.sun_path, filepath);
 bind(sockfd, (struct sockaddr*)&sun, sizeof(sun));

监听
本地套接字的监听、接受链接操做与网络套接字相似。code

链接
链接到一个正在监听的套接字以前,一样须要填充struct sockaddr_un结构,而后调用connect函数。进程

链接创建成功后,咱们就能够像使用网络套接字同样进行发送和接受操做了。甚至还能够将链接设置为非阻塞模式,这里就不赘述了。io

相关文章
相关标签/搜索