您的位置:首页 > 理论基础 > 计算机网络

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.

              下面分别介绍一下各个套接字地址的类型:

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成员,其余部分对用户透明,应用程序无需关心。其长度没有限制(系统中的最大长度)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息