流式套接字与数据报套接字,除了可以完成网络通信,也可以完成本地通信。换句话说,即网络通信中,可以使用流式套接字与数据报套接字来完成。同样本地通信中,也可以使用流式套接字与数据报套接字来实现。
根据上述描述可知流式套接字和数据报套接字,既能实现网络通信,也能实现本地通信。通常把用于本地通信的套接字称为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]; /套接字文件路径/
};