07 | What? 还有本地套接字?
该思维导图由 AI 生成,仅供参考
从例子开始
- 深入了解
- 翻译
- 解释
- 总结
本文深入介绍了本地套接字的概念和使用方法,强调了其在同一台主机上的进程间通信的重要性。与TCP/UDP套接字不同,本地套接字提供了高效的单主机跨进程调用方式,减少了协议栈实现的复杂度。文章通过详细的示例展示了本地字节流套接字的服务器端和客户端编程,以及本地数据报套接字的使用方法。此外,还提到了在Kubernetes和Docker等技术体系中大量使用本地套接字技术的情况。总结指出,本地套接字的编程接口与IPv4、IPv6套接字编程接口一致,支持字节流和数据报两种协议,并且实现效率远高于IPv4和IPv6的套接字实现。读者通过本文可以快速了解本地套接字的特点和使用方法,以及其在实际应用中的重要性。
《网络编程实战》,新⼈⾸单¥59
全部留言(65)
- 最新
- 精选
- supermouse问题一:连接不上。错误提示是“Permission denied” 问题二:在服务端的代码中,对收到的客户端发送的数据长度做了判断,如果长度为0,则主动关闭服务端程序。这是杀死客户端后引发服务端关闭的原因。这也说明客户端在被强行终止的时候,会最后向服务端发送一条空消息,告知服务器自己这边的程序关闭了。 问题三:客户端在连接时会报错,错误提示是“Protocol wrong type for socket (91)”
作者回复: 看样子你都尝试了,实践出真知,赞
2019-11-03692 - 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-17220 - 衬衫的价格是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-2619 - 156527900521.sock文件具体内容什么呢,为什么需要sock文件? 2.本地套接字底层时怎么实现的呢? 3.为什么没有了端口的概念?
作者回复: 1.没什么内容,只是一个占位符,告诉客户端要连哪个sock; 2.没有仔细研读过kernel的代码,不过我猜是大量复用了TCP/IP层的公共实现; 3.因为文件已经告诉我们连接的目标了,所以不需要端口。
2019-08-296 - Sylar.老师您好,方便把全部代码放git吗,因为示例缺少依赖
作者回复: 答疑篇统一回复
2019-08-176 - 奕文章中说 TCP 和 UDP 的scoket 通讯 是走网络协议的,本地socket 通讯减少了网络协议的实现,是说明本地scoket通讯一点都不走网络协议吗? 还是会走其中的一部分网络协议? 如果本地 socket 通讯不走网络协议,那通讯的标准是什么呢? 只是对 socket 文件的读写操作吗?
作者回复: 我是这么理解的,本地套接字本质还是进程间通信,只是借助了套接字的编程语义,比如stream和datagram,最下面肯定不走IP协议的。
2019-08-1755 - J.M.Liudatagram client中,为什么还要bind一个本地地址呀?没有看出这个这个本地地址有什么用呀。难道它是用来作为接受数据的缓冲区的吗?好像没有它也并不影响数据收发,换句话说,client_addr.sun_path填什么好像都无所谓啊。
作者回复: 这个值是为了回包的需要,常规情况是不需要的,但是在某些情况下还是有点作用的,比如让客户端快速出错。
2019-08-303 - 刘丹请问老师本地套接字是否支持一对多、多对多通信?
作者回复: 本地套接字datagram就可以
2019-08-1633 - 重小楼不吃素老师你好,我在讨论区看到“一对多,多对多通信”这样的概念,有点不明白。请问一对多指的是建立一个套接字可以允许多个客户端连接的意思吗? 如果是的话,本地套接字的 SOCK_STREAM 方式也能一对多呀,老师为什么只提到 SOCK_DGRAM 可以? 问题二: TCP\UDP\本地套接字 是否都有发送缓冲区、接收缓冲区,TCP的发送/接收缓冲区很好理解,其余两个我没有查找到说得比较透彻的资料
作者回复: 第一个问题,一对一你可以理解成两个IP地址,一个对另一个发送数据;而一对多,你可以理解成一个IP地址对很多其他IP地址发送数据。 第二个问题,我理解UDP是没有发送和接收缓冲区的,数据被直接传递到数据链路层中发送出去。
2020-08-2422 - 蚂蚁哈哈哈答案: 问题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-301