sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
2013-03-07 14:53
531 查看
1:
struct sockaddr {
unsigned short sa_family; /*地址家族,一般是“AF_xxx”的形式。好像通常大多用的是都是AF_INET*/
char sa_data[14]; /* sa_data是14字节协议地址*/
};
2:
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /*协议族,在socket编程中只能是AF_INET*/
unsigned short int sin_port; /*存储端口号(使用网络字节顺序)*/
struct in_addr sin_addr; /*储IP地址,使用in_addr这个数据结构*/
unsigned char sin_zero[8]; /*为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节*/
};
struct in_addr {
unsigned long s_addr; //按照网络字节顺序存储IP地址
};
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
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。一般定义时候用struct sockaddr 在bind、connect、recvfrom、sendto等中强制转换成struct sockaddr_in类型。
创建
使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:
int sockfd;
sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
绑定
创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是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));
监听
本地套接字的监听、接受连接操作与网络套接字类似。
连接
连接到一个正在监听的套接字之前,同样需要填充struct sockaddr_un结构,然后调用connect函数。
连接建立成功后,我们就可以像使用网络套接字一样进行发送和接受操作了。甚至还可以将连接设置为非阻塞模式,这里就不赘述了。
struct sockaddr {
unsigned short sa_family; /*地址家族,一般是“AF_xxx”的形式。好像通常大多用的是都是AF_INET*/
char sa_data[14]; /* sa_data是14字节协议地址*/
};
2:
sockaddr_in(在netinet/in.h中定义):
struct sockaddr_in {
short int sin_family; /*协议族,在socket编程中只能是AF_INET*/
unsigned short int sin_port; /*存储端口号(使用网络字节顺序)*/
struct in_addr sin_addr; /*储IP地址,使用in_addr这个数据结构*/
unsigned char sin_zero[8]; /*为了让sockaddr与sockaddr_in两个数据结构保持大小相同而保留的空字节*/
};
struct in_addr {
unsigned long s_addr; //按照网络字节顺序存储IP地址
};
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
此数据结构用做bind、connect、recvfrom、sendto等函数的参数,指明地址信息。一般定义时候用struct sockaddr 在bind、connect、recvfrom、sendto等中强制转换成struct sockaddr_in类型。
sockaddr_un
进程间通信的一种方式是使用UNIX套接字,人们在使用这种方式时往往用的不是网络套接字,而是一种称为本地套接字的方式。这样做可以避免为黑客留下后门。创建
使用套接字函数socket创建,不过传递的参数与网络套接字不同。域参数应该是PF_LOCAL或者PF_UNIX,而不能用PF_INET之类。本地套接字的通讯类型应该是SOCK_STREAM或SOCK_DGRAM,协议为默认协议。例如:
int sockfd;
sockfd = socket(PF_LOCAL, SOCK_STREAM, 0);
绑定
创建了套接字后,还必须进行绑定才能使用。不同于网络套接字的绑定,本地套接字的绑定的是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));
监听
本地套接字的监听、接受连接操作与网络套接字类似。
连接
连接到一个正在监听的套接字之前,同样需要填充struct sockaddr_un结构,然后调用connect函数。
连接建立成功后,我们就可以像使用网络套接字一样进行发送和接受操作了。甚至还可以将连接设置为非阻塞模式,这里就不赘述了。
相关文章推荐
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- (摘录)sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- (摘录)sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr,sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- 整理:Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- (转)Linux网络编程之sockaddr与sockaddr_in,sockaddr_un结构体详细讲解
- sockaddr与sockaddr_in结构体详细讲解 二者区别