本地套接字实现的是同一主机的不同进程间的通信,且建立的通信是双向的通信。socket本地通信与网络通信使用的是统一套接口,只是地址结构中的参数不同。
1、socket流程
(1)创建socket
创建套接字需要使用 socket 系统调用,其原型如下:
int socket(int domain, int type, int protocol);
参数:
domain :指定协议族,对于本地套接字来说,其值须被置为 AF_UNIX 枚举值;
type :套接字类型,type 参数可被设置为 SOCK_STREAM(流式套接字)或 SOCK_DGRAM(数据报式套接字)
protocol 参数指定具体协议,protocol 字段应被设置为 0;
返回:生成的套接字描述符
套接字类型:
流式套接字(SOCK_STREAM)是一个有顺序的、可靠的双向字节流,相当于在本地进程之间建立起一条数据通道;
数据报式套接字(SOCK_DGRAM)相当于单纯的发送消息,在进程通信过程中,理论上可能会有信息丢失、复制或者不按先后次序到达的情况,但由于其在本地通信,不通过外界网络,这些情况出现的概率很小。
//创建本地socket
int server_sockfd = socket(PF_UNIX, SOCK_STREAM, 0);
(2)绑定和连接地址
1)绑定地址
通过绑定地址来指定服务器端的地址(struct sockaddr_un),本地socket的地址是本地文件的地址。
bind 绑定定函数:
int bind(int socket, const struct sockaddr *address, size_t address_len);
参数:
socket表示服务器端的套接字描述符
address 表示需要绑定的本地地址,是一个 struct sockaddr_un 类型的变量
address_len 表示该本地地址的字节长度
本地socket绑定,监听该地址的网络事件
struct sockaddr_un server_addr;
server_addr.sun_family = AF_UNIX;
strncpy(server_addr.sun_path, UNIX_DOMAIN