网络编程实战
盛延敏
前大众点评云平台首席架构师
44207 人已学习
新⼈⾸单¥59
登录后,你可以任选4讲全文学习
课程目录
已完结/共 40 讲
网络编程实战
15
15
1.0x
00:00/00:00
登录|注册

07 | What? 还有本地套接字?

SOCK_DGRAM
AF_LOCAL
读取字符串并发送
发起connect调用
初始化目标服务器端地址
创建套接字类型
read和write函数
bind和listen操作
文件类型
绝对路径
字节流格式
AF_LOCAL
Container Runtime Interface
读取字符串并发送
bind到本地地址
创建套接字类型
使用recvfrom和sendto进行数据报的收发
bind到本地地址
创建套接字类型
服务器-客户端应答
服务器端监听在无权限的文件路径上
只启动客户端
客户端程序
服务器端程序解释
创建本地地址
创建套接字类型
高效率
RPC调用
共享内存
UNIX管道
本地套接字技术应用
CRI
奇怪的场景
服务器端正常退出逻辑
客户端连接权限问题
实现效率高
编程接口一致
服务器端和客户端通过数据报应答的场景
客户端例子
服务器端例子
场景
服务器端例子
X Window实现
IPC机制
特殊类型的套接字
Docker
Kubernetes
高接受度
开发便捷
共享消息队列
管道
本地套接字
同一台主机上进程间通信
本地进程间通信
思考题
总结
本地数据报套接字
本地字节流套接字
本地套接字概述
技术体系
优势
实现方式
适用场景
IPC
本地套接字

该思维导图由 AI 生成,仅供参考

你好,我是盛延敏,这里是网络编程实战第 7 讲,欢迎回来。
上一篇文章中,我们讲了 UDP。很多同学都知道 TCP 和 UDP,但是对本地套接字却不甚了解。
实际上,本地套接字是 IPC,也就是本地进程间通信的一种实现方式。除了本地套接字以外,其它技术,诸如管道、共享消息队列等也是进程间通信的常用方法,但因为本地套接字开发便捷,接受度高,所以普遍适用于在同一台主机上进程间通信的各种场景。
那么今天我们就来学习下本地套接字方面的知识,并且利用本地套接字完成可靠字节流和数据报两种协议。

从例子开始

现在最火的云计算技术是什么?无疑是 Kubernetes 和 Docker。在 Kubernetes 和 Docker 的技术体系中,有很多优秀的设计,比如 Kubernetes 的 CRI(Container Runtime Interface),其思想是将 Kubernetes 的主要逻辑和 Container Runtime 的实现解耦。
我们可以通过 netstat 命令查看 Linux 系统内的本地套接字状况,下面这张图列出了路径为 /var/run/dockershim.socket 的 stream 类型的本地套接字,可以清楚地看到开启这个套接字的进程为 kubelet。kubelet 是 Kubernetes 的一个组件,这个组件负责将控制器和调度器的命令转化为单机上的容器实例。为了实现和容器运行时的解耦,kubelet 设计了基于本地套接字的客户端 - 服务器 GRPC 调用。
确认放弃笔记?
放弃后所记笔记将不保留。
新功能上线,你的历史笔记已初始化为私密笔记,是否一键批量公开?
批量公开的笔记不会为你同步至部落
公开
同步至部落
取消
完成
0/2000
荧光笔
直线
曲线
笔记
复制
AI
  • 深入了解
  • 翻译
    • 英语
    • 中文简体
    • 中文繁体
    • 法语
    • 德语
    • 日语
    • 韩语
    • 俄语
    • 西班牙语
    • 阿拉伯语
  • 解释
  • 总结

本文深入介绍了本地套接字的概念和使用方法,强调了其在同一台主机上的进程间通信的重要性。与TCP/UDP套接字不同,本地套接字提供了高效的单主机跨进程调用方式,减少了协议栈实现的复杂度。文章通过详细的示例展示了本地字节流套接字的服务器端和客户端编程,以及本地数据报套接字的使用方法。此外,还提到了在Kubernetes和Docker等技术体系中大量使用本地套接字技术的情况。总结指出,本地套接字的编程接口与IPv4、IPv6套接字编程接口一致,支持字节流和数据报两种协议,并且实现效率远高于IPv4和IPv6的套接字实现。读者通过本文可以快速了解本地套接字的特点和使用方法,以及其在实际应用中的重要性。

仅可试看部分内容,如需阅读全部内容,请付费购买文章所属专栏
《网络编程实战》
新⼈⾸单¥59
立即购买
登录 后留言

全部留言(65)

  • 最新
  • 精选
  • supermouse
    问题一:连接不上。错误提示是“Permission denied” 问题二:在服务端的代码中,对收到的客户端发送的数据长度做了判断,如果长度为0,则主动关闭服务端程序。这是杀死客户端后引发服务端关闭的原因。这也说明客户端在被强行终止的时候,会最后向服务端发送一条空消息,告知服务器自己这边的程序关闭了。 问题三:客户端在连接时会报错,错误提示是“Protocol wrong type for socket (91)”

    作者回复: 看样子你都尝试了,实践出真知,赞

    2019-11-03
    6
    92
  • GeekAmI
    问题1: $ sudo ./unixstreamserver /var/lib/unixstream.sock $ ./unixstreamclient /var/lib/unixstream.sock connect failed: Permission denied (13) 问题2: client: Ctrl + C -> exit(0) -> 发送FIN包; server:满足条件read(connfd, buf, BUFFER_SIZE) == 0,结束。 问题3: $ ./unixdataserver /tmp/unixdata.sock $ ./unixstreamclient /tmp/unixdata.sock connect failed: Protocol wrong type for socket (41)

    作者回复: 👍

    2019-10-17
    2
    20
  • 衬衫的价格是19美元
    为什么AF_LOCAL+DGRAM的时候,客户端需要bind一个本地文件? 因为服务器收到来自客户端的数据想要给客户端回复的时候,需要知道发给谁。在其他情况下,服务器都有办法: 1.当使用STREAM时,不管是AF_INET还是AF_LOCAL, 都有连接的概念,所以服务器可以使用原来的连接 2.当使用AF_INET时,不管是DGRAM还是STREAM, 都能知道对方的ip+port, 也能确定一个唯一的进程 只有AF_LOCAL+DGRAM的时候,没有连接,也没有ip_+port, 只能显式的指定一个标志告诉服务端

    作者回复: 👍

    2020-06-26
    19
  • 15652790052
    1.sock文件具体内容什么呢,为什么需要sock文件? 2.本地套接字底层时怎么实现的呢? 3.为什么没有了端口的概念?

    作者回复: 1.没什么内容,只是一个占位符,告诉客户端要连哪个sock; 2.没有仔细研读过kernel的代码,不过我猜是大量复用了TCP/IP层的公共实现; 3.因为文件已经告诉我们连接的目标了,所以不需要端口。

    2019-08-29
    6
  • Sylar.
    老师您好,方便把全部代码放git吗,因为示例缺少依赖

    作者回复: 答疑篇统一回复

    2019-08-17
    6
  • 文章中说 TCP 和 UDP 的scoket 通讯 是走网络协议的,本地socket 通讯减少了网络协议的实现,是说明本地scoket通讯一点都不走网络协议吗? 还是会走其中的一部分网络协议? 如果本地 socket 通讯不走网络协议,那通讯的标准是什么呢? 只是对 socket 文件的读写操作吗?

    作者回复: 我是这么理解的,本地套接字本质还是进程间通信,只是借助了套接字的编程语义,比如stream和datagram,最下面肯定不走IP协议的。

    2019-08-17
    5
    5
  • J.M.Liu
    datagram client中,为什么还要bind一个本地地址呀?没有看出这个这个本地地址有什么用呀。难道它是用来作为接受数据的缓冲区的吗?好像没有它也并不影响数据收发,换句话说,client_addr.sun_path填什么好像都无所谓啊。

    作者回复: 这个值是为了回包的需要,常规情况是不需要的,但是在某些情况下还是有点作用的,比如让客户端快速出错。

    2019-08-30
    3
  • 刘丹
    请问老师本地套接字是否支持一对多、多对多通信?

    作者回复: 本地套接字datagram就可以

    2019-08-16
    3
    3
  • 重小楼不吃素
    老师你好,我在讨论区看到“一对多,多对多通信”这样的概念,有点不明白。请问一对多指的是建立一个套接字可以允许多个客户端连接的意思吗? 如果是的话,本地套接字的 SOCK_STREAM 方式也能一对多呀,老师为什么只提到 SOCK_DGRAM 可以? 问题二: TCP\UDP\本地套接字 是否都有发送缓冲区、接收缓冲区,TCP的发送/接收缓冲区很好理解,其余两个我没有查找到说得比较透彻的资料

    作者回复: 第一个问题,一对一你可以理解成两个IP地址,一个对另一个发送数据;而一对多,你可以理解成一个IP地址对很多其他IP地址发送数据。 第二个问题,我理解UDP是没有发送和接收缓冲区的,数据被直接传递到数据链路层中发送出去。

    2020-08-24
    2
    2
  • 蚂蚁哈哈哈
    答案: 问题1: 客户端报错: "connect failed: Permission denied" 问题2: 下面这段代码中 == 0 的代码表示的就是客户端推出,这时候服务端打印 "client quit", 然后推出 read 循环,关闭服务端程序。 `if (read(connfd, buf, BUFFER_SIZE) == 0) { printf("client quit"); break; }` 问题三: 客户端报错 "connect failed: Protocol wrong type for socket"

    作者回复: 你的昵称好汗~

    2021-01-30
    1
收起评论
显示
设置
留言
65
收藏
沉浸
阅读
分享
手机端
快捷键
回顶部