在笔记套接字中已经介绍了套接字的分类:流式套接字( SOCK_STREAM
)、数据报套接字( SOCK_DGRAM
)和原始套接字( SOCK_RAW
)。需要注意的是 BSD
分支最初引入套接字时只支持本地通信, 1986
年之后进行了扩展,开始支持网络协议。因此,流式套接字与数据报套接字,除可以完成网络通信外,也可以完成本地通信。换句话说,网络通信中,可以使用流式套接字与数据报套接字来完成。同理,本地通信中,也可以使用流式套接字与数据报套接字来实现。
通常把用于本地通信的套接字成为 UNIX域套接字
。
UNIX域套接字只能用于在同一个计算机的进程间通信。虽然网络套接字也可以用于单机进程间的通信,但使用UNIX域套接字不仅简单而且高效。UNIX域套接字仅仅进行数据复制,不会执行在网络协议栈中需要处理的添加、删除报头文、计算校验和、计算报文顺序等复杂操作,因而在本地的进程间通信中,更加推荐使用UNIX域套接字。UNIX域套接字常用于前后台进程间的通信。
当套接字用于网络通信时,在编程过程中,使用结构体 struct_sockaddr_in
(包含协议、IP地址、端口)和套接字文件描述符关联起来。同样,当套接字用于本地通信时,可以用结构体 struct_sockaddr_un
描述一个本地地址。
#define Unix_PATH_MAX 108 typedef unsigned short __kernel_sa_family_t; struct sockaddr_un { __kernel_sa_family_t sun_family; // AF_Unix char sun_path[Unix_PATH_MAX]; // pathname };点击复制复制失败已复制
将宏定义即重定义替换为原型,则结构体原型如下所示:
struct sockaddr_un { unsigned short sun_family; // 协议类型 char sun_path[108]; // 套接字文件路径 };