AF_UNIX和AF_INET
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'
Server
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()
Client
1. AF_INET域socket通信过程
典型的TCP/IP四层模型的通信过程。
发送方、接收方依赖IP:Port来标识,即将本地的socket绑定到对应的IP端口上,发送数据时,指定对方的IP端口,经过Internet,可以根据此IP端口最终找到接收方;接收数据时,可以从数据包中获取到发送方的IP端口。
发送方通过系统调用send()将原始数据发送到操作系统内核缓冲区中。内核缓冲区从上到下依次经过TCP层、IP层、链路层的编码,分别添加对应的头部信息,经过网卡将一个数据包发送到网络中。经过网络路由到接收方的网卡。网卡通过系统中断将数据包通知到接收方的操作系统,再沿着发送方编码的反方向进行解码,即依次经过链路层、IP层、TCP层去除头部、检查校验等,最终将原始数据上报到接收方进程。
2. AF_UNIX域socket通信过程
典型的本地IPC,类似于管道,依赖路径名标识发送方和接收方。即发送数据时,指定接收方绑定的路径名,操作系统根据该路径名可以直接找到对应的接收方,并将原始数据直接拷贝到接收方的内核缓冲区中,并上报给接收方进程进行处理。同样的接收方可以从收到的数据包中获取到发送方的路径名,并通过此路径名向其发送数据。
3. 相同点
操作系统提供的接口socket(),bind(),connect(),accept(),send(),recv(),以及用来对其进行多路复用事件检测的select(),poll(),epoll()都是完全相同的。收发数据的过程中,上层应用感知不到底层的差别。
4. 不同点
1 建立socket传递的地址域,及bind()的地址结构稍有区别:
socket() 分别传递不同的域AF_INET和AF_UNIX
bind()的地址结构分别为sockaddr_in(制定IP端口)和sockaddr_un(指定路径名)
2 AF_INET需经过多个协议层的编解码,消耗系统cpu,并且数据传输需要经过网卡,受到网卡带宽的限制。AF_UNIX数据到达内核缓冲区后,由内核根据指定路径名找到接收方socket对应的内核缓冲区,直接将数据拷贝过去,不经过协议层编解码,节省系统cpu,并且不经过网卡,因此不受网卡带宽的限制。
3 AF_UNIX的传输速率远远大于AF_INET
3 AF_INET不仅可以用作本机的跨进程通信,同样的可以用于不同机器之间的通信,其就是为了在不同机器之间进行网络互联传递数据而生。而AF_UNIX则只能用于本机内进程之间的通信。
5. 使用场景
AF_UNIX由于其对系统cpu的较少消耗,不受限于网卡带宽,及高效的传递速率,本机通信则首选AF_UNIX域。不用多说,AF_INET则用于跨机器之间的通信。
转载于:https://www.cnblogs.com/shangerzhong/p/9153737.html
AF_UNIX和AF_INET相关推荐
- socket PF_INET AF_INET 区别
在写网络程序的时候,建立TCP socket: sock = socket(PF_INET, SOCK_STREAM, 0); 然后在绑定本地地址或连接远程地址时需要初始化sockaddr_in结构, ...
- 【转】PF_INET 和 AF_INET 的区别
转自:PF_INET 和 AF_INET 的区别 - 52php - 博客园 在写网络程序的时候,建立TCP socket: 1 sock = socket(PF_INET, SOCK_STREAM, ...
- 关于PF_INET和AF_INET的区别
在写网络程序的时候,建立TCP socket: sock = socket(PF_INET, SOCK_STREAM, 0); 然后在绑定本地地址或连接远程地址时需要初始化sockaddr_in结构, ...
- PF_INET 和 AF_INET的区别
AF 表示ADDRESS FAMILY 地址族 PF 表示PROTOCL FAMILY 协议族 Winsock2.h中 #define AF_INET 0 #define PF_INET AF_IN ...
- PF_INET 和 AF_INET的说明!
本文转自 http://blog.sina.com.cn/s/blog_3e28c8a50100abci.html AF 表示ADDRESS FAMILY 地址族 PF 表示PROTOCL FAMIL ...
- python socket编程
python 编写server的步骤: 1.第一步是创建socket对象.调用socket构造函数.如: socket = socket.socket( family, type ) family参数 ...
- Python3 网络编程(转载)
1.Socket编程介绍 socket是基于C/S架构的,也就是说进行socket网络编程时,通常需要两个文件,一个是服务端,一个客户端 首先导入socket模块:import socket pyth ...
- python网络编程
python学习记录--网络编程 1.套接字介绍 一台机器上的不同进程之间进行通信可以利用队列,管道等,但是不同机器之间的进程进行通信用队列是不行的,解决这个问题就是网络套接字. 套接字是计算机网络数 ...
- Python网络编程1--笔记
网络编程 一.客户端与服务器架构 硬件的客户端与服务器架构:打印机服务器,文件服务器 硬件服务器有关门的设备,打印机服务器有打印机,文件服务器NFS有磁盘. 软件的客户端与服务器架构:web服务器,数 ...
最新文章
- Microbiome:浙大马忠华团队-生防细菌抑制病原真菌新机制
- 二极管的反向恢复过程
- android layout background,Android LinearLayout Gradient Background
- mac电脑下Tomcat和Apach配置流程(超详细)
- [react] 什么时候使用状态管理器?
- [dts]DTS实例分析
- 使用 VSCode 开发 uniapp
- Linux看硬盘同步,从磁盘同步看linux的机制和策略
- 支持中文编程、汉语编程的国产C语言编程工具 - 习语言4717版发布
- 《团队作业第二周》五小福团队作业——UNO
- pmon 源码分析之start.S
- 我他妈的是什么!!!!
- 病毒式传播2.0时代的社交游戏开发5要素
- 内核tcp协议栈SACK的处理
- 中文版扩散模型课程:第一单元
- 手机的九宫格图案解锁总共能绘出多少种图案?LeetCode 351. Android Unlock Patterns
- maven 配置多个仓库
- 辛苦整理SBM模型Matlab工具包资料
- 机器人瓦力材质库下载_机器人总动员/瓦力[BD中英双字1024/1280高清版]
- animators vs animations