Unix网络编程(一)-套接字地址结构
2014-08-06 11:00
204 查看
注明:本文为学习经验的总结,绝大部分引用自Unix网络编程卷一,有错误或者交流意见请发邮件至yb.zhaoyubo@gmail.com.非常感谢
套接字地址结构用于标识网络通信或本地通信中的一个端点。端点可以理解成IP地址与端口号的组合。
一般情况下,所有的套接字地址都有两个结构成员:
第一个成员为:sin_len,此成员是为增加对OSI协议的支持而随4.3BSD-Reno添加的,POSIX规范不要求有这个成员。
第二个成员为:sin_family,此成员主要决定套接字地址结构的类型。常用的有AF_INET,AF_INET6,AF_LOCAL,AF_LINK.
下面分别介绍一下各个套接字地址的类型:
![](https://img-blog.csdn.net/20140806112534967?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDA3MDQxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
以下介绍两种长度可变的套接字地址结构AF_LOCAL,AF_LINK。
![](https://img-blog.csdn.net/20140806122855742?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDA3MDQxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
Unix域套接字常用于无亲缘关系的进程间的通信。sun_path应存放文件系统的路径名。
这里应注意两点:
1.应用进程不应该假设一个特定的长度,此套接字地址结构长度是可变的,运行时应使用sizeof运算符加以确定。
2.此套接字与tcp或udp套接字绑定环回地址127.0.0.1进行通信有本质的区别,前者不经过协议栈,由内核直接送达到相应缓冲区。后者由内核送达到个协议栈,在链路层接口环回本机。因此使用Unix域套接字进行通信的速度更快。
关于unix域套接字及进程间的通信我们以后的文章在详细介绍。
4.AF_LINK 数据链路套接字地址结构
此套接字地址结构有时候会作为路由套接字操作的返回值,或用于直接访问数据链路层。我们在下图给出其结构,在<net/if_dl.h>头文件中还给出了关于sdr_data成员操作的宏,详细的讨论在之后的文章写出。
![](https://img-blog.csdn.net/20140806131216392?watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvdTAxNDA3MDQxNA==/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center)
5.通用套接字地址结构
当套接字地址结构总是以引用形式作为参数传递,使用通用套接字地址结构可以做到程序与套接字地址类型无关的多态性。
常用的通用套接字地址结构如下:
但此结构对于IPv6套接字地址结构太小,不能用它做到IPv4与IPv6的兼容性。因此作为IPv6的套接字API定义了一个新的通用的套接字地址结构。struct sockaddr_storage。
此结构定义了sa_len和sa_family成员,其余部分对用户透明,应用程序无需关心。其长度没有限制(系统中的最大长度)。
套接字地址结构用于标识网络通信或本地通信中的一个端点。端点可以理解成IP地址与端口号的组合。
一般情况下,所有的套接字地址都有两个结构成员:
第一个成员为:sin_len,此成员是为增加对OSI协议的支持而随4.3BSD-Reno添加的,POSIX规范不要求有这个成员。
第二个成员为:sin_family,此成员主要决定套接字地址结构的类型。常用的有AF_INET,AF_INET6,AF_LOCAL,AF_LINK.
下面分别介绍一下各个套接字地址的类型:
1.AF_INET
这是最常用的IPv4地址族套接字地址。在<netinet/in.h>头文件中给出了他的定义。2.AF_INET6 为IPV6地址族,在/usr/include/netinet/in.h这里不再给出。
这两个套接字地址结构都是固定长度的。以下介绍两种长度可变的套接字地址结构AF_LOCAL,AF_LINK。
3.UNIX域套接字地址结构 AF_LOCAL
Unix域套接字常用于无亲缘关系的进程间的通信。sun_path应存放文件系统的路径名。
这里应注意两点:
1.应用进程不应该假设一个特定的长度,此套接字地址结构长度是可变的,运行时应使用sizeof运算符加以确定。
2.此套接字与tcp或udp套接字绑定环回地址127.0.0.1进行通信有本质的区别,前者不经过协议栈,由内核直接送达到相应缓冲区。后者由内核送达到个协议栈,在链路层接口环回本机。因此使用Unix域套接字进行通信的速度更快。
关于unix域套接字及进程间的通信我们以后的文章在详细介绍。
4.AF_LINK 数据链路套接字地址结构
此套接字地址结构有时候会作为路由套接字操作的返回值,或用于直接访问数据链路层。我们在下图给出其结构,在<net/if_dl.h>头文件中还给出了关于sdr_data成员操作的宏,详细的讨论在之后的文章写出。5.通用套接字地址结构
当套接字地址结构总是以引用形式作为参数传递,使用通用套接字地址结构可以做到程序与套接字地址类型无关的多态性。常用的通用套接字地址结构如下:
#include struct sockaddr{ uint8_t sa_len; sa_family_t sa_family; char sa_data[14]; };
但此结构对于IPv6套接字地址结构太小,不能用它做到IPv4与IPv6的兼容性。因此作为IPv6的套接字API定义了一个新的通用的套接字地址结构。struct sockaddr_storage。
此结构定义了sa_len和sa_family成员,其余部分对用户透明,应用程序无需关心。其长度没有限制(系统中的最大长度)。
相关文章推荐
- Unix网络编程 卷1 第3章:套接字编程简介(套接字地址结构)
- Unix网络编程(一):套接字地址结构
- UNIX网络编程(三)-套接字地址结构
- Unix网络编程学习笔记【1】套接字地址结构
- Unix网络编程学习笔记【1】套接字地址结构
- unix网络编程之套接字地址结构
- UNIX网络编程(3.6)TCP、通配、套接字地址结构、值-结果参数
- 【UNIX网络编程(一)】套接字地址结构、网络字节顺序和地址转换功能
- Unix网络编程(二)套接字地址结构常用函数
- 【UNIX网络编程(一)】套接字地址结构、网络字节序和地址转换函数
- unix网络编程第一卷学习之套接字地址结构
- UNIX网络编程(6)--套接字地址结构、通用套接字地址结构
- UNIX网络编程第3章套接字编程简介3.2套接字地址结构3.3值结果参数3.4字节排序函数
- UNIX网络编程之几种套接字地址结构说明
- 《unix网络编程》读书笔记——(一)套接字地址结构
- UNIX网络编程——套接字选项(心跳检测、绑定地址复用)
- 套接字地址结构
- linux网络编程之一般应用采用的协议和不同套接字的地址结构以及用户进程和内核通过哪些函数传递套接字的地址结构
- 六、Linux网络编程-socket、套接字地址结构、地址转换、字节序、套接字类型
- UNIX网络编程——套接字选项(心跳检测、绑定地址复用)