有关socket AF_UNIX的一点心得

本文介绍了一种使用 AF_UNIX 套接字进行同一台机器上进程间通信的方法,并通过 select 函数实现了非阻塞 socket 的功能。文章提供了 Server 端与 Client 端的代码示例。

转自:http://blog.youkuaiyun.com/yuxi2046/article/details/6996105

socket=socket.socket(family, type)
 

family参数代表地址家族,比较常用的为AF_INET或AF_UNIX。AF_UNIX用于同一台机器上的进程间通信,AF_INET对于IPV4协议的TCP和UDP 。

type参数代表套接字类型,SOCK_STREAM(流套接字)或者SOCK_DGRAM(数据报文套接字)。

其中AF_INET类型有关的例子非常多,但AF_UNIX的少见,所以给出一个AF_UNIX简单的例子,并通过select实现非阻塞socket。

Server端:

<pre class="python" name="code">import os
import socket
import select
import sys

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)
path = './tt.d'
if os.path.exists(path):
   os.unlink(path)
sock.bind(path)
sock.listen(5)

infds, outfds, errfds = select.select([sock,],[],[],5)
if len(infds) != 0:
   con,addr = sock.accept()
   print con.recv(1024)
   con.close()
   sock.close()
print '5 seconds later no data coming'
 


Client端:

</pre><pre class="python" name="code">import socket  

sock = socket.socket(socket.AF_UNIX, socket.SOCK_STREAM)  
sock.connect('./tt.d')  
sock.send('Hello Socket')  
sock.close()


 

<think>我们被要求解释socket编程中AF_UNIX参数的含义。根据引用[1]和[2],AF_UNIXsocket函数中domain参数的一个选项,表示使用本地通信(同一台机器上的进程间通信)。引用[3]进一步解释了AF_UNIXAF_INET的区别:AF_UNIX用于本地通信,不需要经过网络协议栈和网卡,因此效率更高,而AF_INET用于网络通信(如IPv4)。 引用[4]展示了一个使用AF_UNIX进行本机数据流通信的示例代码。 因此,我们可以总结:AF_UNIXsocket的协议族(domain)选项之一,用于同一主机上的进程间通信(IPC)。它使用文件系统路径名作为地址(如引用4中的"server_socket"),通信时数据直接在内核中复制,不经过网络协议栈,因此效率高、速度快。 回答结构: 1. 定义:AF_UNIX是什么,用于什么场景。 2. 特点:与AF_INET对比,突出其高效性(引用3中的解释)。 3. 地址结构:使用文件路径作为地址(sockaddr_un结构体,包含sun_family和sun_path)。 4. 示例:简单提及引用4中的代码,说明如何创建和使用AF_UNIX socket。 注意:按照要求,行内数学表达式用$...$,但这里没有数学表达式,所以不需要。独立公式也没有,所以直接文字描述。 另外,在回答末尾生成相关问题。 引用标识:在适当的地方添加引用标识,如[^1][^2][^3] </think> ### Socket编程中`AF_UNIX`参数详解 在Socket编程中,`AF_UNIX`是`socket()`函数的`domain`参数选项之一,用于指定**本地进程间通信(IPC)**。其核心含义和特点如下: #### 1. **基本定义** - `AF_UNIX`(也称为`AF_LOCAL`)表示使用 **Unix域套接字**,专用于**同一台主机上的进程间通信**[^2]。 - 与网络通信(如`AF_INET`)不同,它通过**文件系统路径名**标识通信端点(例如`/tmp/socket_file`),而非IP地址和端口。 #### 2. **核心特点** - **高效传输**:数据直接在内核缓冲区间拷贝,**不经过网络协议栈**(如TCP/IP分层),避免了编解码开销,CPU消耗低[^3]。 - **无需网卡**:通信不依赖网络硬件,**不受网卡带宽限制**[^3]。 - **可靠性**:提供有序、可靠的字节流(`SOCK_STREAM`)或数据报(`SOCK_DGRAM`)传输。 - **安全性**:通过文件系统权限控制访问(如Linux的文件权限位)。 #### 3. **地址结构** 使用`struct sockaddr_un`定义地址,包含两个字段: ```c struct sockaddr_un { sa_family_t sun_family; // 固定为AF_UNIX char sun_path[108]; // 套接字文件路径(如"server_socket") }; ``` 示例(引用[4]): ```c struct sockaddr_un address; address.sun_family = AF_UNIX; strcpy(address.sun_path, "server_socket"); // 绑定到文件路径 ``` #### 4. **典型使用场景** - 同一主机上的**进程间数据交换**(如数据库客户端/服务端)。 - 需要**高性能IPC**的应用(如容器间通信、进程监控)。 - 替代管道(Pipe)或共享内存,提供更灵活的通信模式。 #### 5. **与`AF_INET`对比** | **特性** | `AF_UNIX` | `AF_INET` | |----------------|----------------------------|----------------------------| | 通信范围 | 单机进程间 | 跨网络主机 | | 性能 | 更高(无协议栈开销)[^3] | 较低(需协议栈处理) | | 地址标识 | 文件系统路径 | IP地址+端口号 | | 数据路径 | 内核缓冲区直拷 | 经网卡传输 | ### 示例代码简述 引用[4]展示了`AF_UNIX`的典型流程: 1. 创建套接字:`socket(AF_UNIX, SOCK_STREAM, 0)` 2. 绑定地址:`struct sockaddr_un`设置路径`server_socket` 3. 连接/读写:通过`connect()`和`read()`/`write()`通信 (完整代码见引用[4]) ---
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值