UNIX Domain Socket IPC

UNIX Domain Socket作为IPC机制比网络socket更高效,不经过网络协议栈,适用于同一主机进程间通信。本文介绍了其原理、API使用,包括socket(), bind(), listen(), accept(), connect()等,并给出了服务器和客户端的实例。" 112348059,9108601,Python进阶:文件与IO操作详解,"['Python', '文件处理', '目录管理', 'IO操作']

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

目录


概述

socket API原本是为网络通讯设计的,但是后来在socket的框架上发展出一种IPC机制,就是UNIX Domain Socket。

虽然网络socket也可用于同一台主机的进程间通讯(通过loopback地址127.0.0.1),但是UNIX Domain Socket用于IPC更有效率:

  • 不需要经过网络协议栈。
  • 不需要打包拆包
  • 不需要计算校验和
  • 不需要维护序号和应答等

这是因为IPC机制本质上是可靠的通讯,而网络协议是为不可靠的通讯设计的。UNIX Domain Socket也提供面向流和面向数据包两种API接口,类似TCP和UDP,但是面向流的UNIX Domain Socket也是可靠的,消息既不会丢失也不会顺序错乱。

使用UNIX Domain Socket的过程和网络socket十分相似,也要先调用socket()创建一个socket文件描述符,address family指定为AF_UNIX,type可以选择SOCK_STREAM或SOCK_DGRAM,protocol参数仍然指定为0即可。

UNIX Domain Socket与网络socket编程最明显的不同在于地址格式不同,用结构体sockaddr_un表示,网络编程的socket地址是IP地址加端口号,而UNIX Domain Socket的地址是一个socket类型的文件在文件系统中的路径,这个socket文件由bind()调用创建,如果调用bind()时该文件已经存在,则bind()错误返回。


socket函数使用

接下来,把UNIX Domain Socket编程用到的几个主要函数讲解一下。

struct sockaddr_un

UNIX Domain Socket使用的地址结构体定义如下:

#define UNIX_PATH_MAX 108

struct sockaddr_un {
    sa_family_t sun_family; /* AF_UNIX */
    char sun_path[UNIX_PATH_MAX]; /* pathname */
};

socket()

#include <sys/types.h>
#include <sys/socket.h>
int socket(int domain, int type, int protocol);

参数定义如下:

  1. domain指定socket的通信协议集(AF_UNIX和AF_INET等)

    • AF_UNIX(与AF_LOCAL和AF_FILE相同)只能够用于单一的unix的系统上,使用AF_UNIX会在系统上创建一个socket文件,不同进程通过读写这个文件来实现通信。
    • AF_INET则是用于网络的,所以可以允许远程主机之间的通信。
  2. type指定socket的类型(SOCK_STREAM和SOCK_DGRAM等)

    • SOCK_STREAM表明使用TCP协议,这就意味着会提供按顺序的、可靠、双向、面向连接的比特流。
    • SOCK_DGRAM表明使用UDP协议,这就意味着会提供定长的、不可靠、无连接的通信。
  3. protocol指定实际使用的传输协议。最常见的就是IPPROTO_TCP、IPPROTO_STCP、IPPROTO_UDP、IPPROTO_DCCP。如果该项为0,即根据选定的domain和type选择使用缺省协议。

调用socket()函数后,成功会返回文件描述符,失败则返回-1。


bind()


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值