架构师_程序员_码农网

 找回密码
 注册[Register]

QQ登录

只需一步,快速开始

搜索
查看: 38|回复: 3

[技巧] .NET/C# 进程之间基于 gRPC 和 Unix 域套接字通信

[复制链接]
发表于 前天 20:24 | 显示全部楼层 |阅读模式
需求:在同一台服务器上面,进程之间使用匿名管道、命名管道、内存映射文件、HTTP、TCP、Standard Input/Output Streams 等方式进行通信。有时候服务器需要部署多个应用,应用之间其实可以采用 gRPC 和 Unix 域套接字通信。

回顾
.NET/C# 基于 NamedPipe 命名管道跨进程通信[附源码]
https://www.itsvse.com/thread-10628-1-1.html

.NET/C# 父子进程使用 MemoryMappedFile 通信
https://www.itsvse.com/thread-10983-1-1.html

.NET/C# 父子进程使用标准输入输出流通信
https://www.itsvse.com/thread-10982-1-1.html

Unix 域套接字

Unix域套接字( UDS )、本地套接字或进程间通信( IPC )套接字是在同一Unix或类 Unix操作系统 中执行的进程之间交换数据的通信端点。

Unix 域套接字 (Unix domain socket)这个名称指的是传递给创建套接字系统资源的函数的domain参数值。 相同的通信域也由 来选择。[ 1 ]AF_UNIXAF_LOCAL

typeUDS 的有效参数值为:

  • SOCK_STREAM(与TCP相比) – 用于面向流的套接字
  • SOCK_DGRAM(与UDP相比)——用于保留消息边界的面向数据报的套接字(与大多数 UNIX 实现一样,UNIX 域数据报套接字始终可靠并且不会重新排序数据报)
  • SOCK_SEQPACKET(与SCTP相比)——面向连接的顺序数据包套接字,保留消息边界,并按照消息发送的顺序传递消息


UDS 工具是POSIX 操作系统的标准组件。

为什么要使用 Unix 域套接字?

Unix 域套接字允许在单台机器上进行进程间通信。那么,为什么你会选择它们而不是 TCP/IP 呢?例如,在 TCP/IP 中,你可以使用环回地址 ( localhost) 进行单服务器通信。在 Windows 上,为什么你会选择它们而不是 Windows 命名管道?

一般来说,选择使用 UDS 而不是 TCP/IP 进行进程间通信可能有以下几个原因:

  • 与使用 TCP/IP 相比,Unix 域套接字通常具有更少的开销和更快的传输速度
  • TCP/IP 套接字是一种有限的资源,而 Unix 域套接字没有硬性限制
  • Unix 域套接字以文件形式出现,因此很容易“发现”已知路径
  • 与文件系统的集成还增加了额外的安全层(如果您无法访问文件路径,则无法访问套接字)


第一点很容易理解——快速谷歌一下就会发现,UDS 与 TCP/IP 的基准测试结果总是 UDS 更胜一筹,因为它不仅延迟显著降低,吞吐量也显著提升。这主要源于UDS 针对同服务器通信进行了优化,而 IP 通信则localhost必须在发送端和接收端都经过 IP 栈

TCP/IP 套接字是一种有限资源;您任何时候最多只能使用 65,535 个套接字。如果加上问题,TIME_WAIT实际可用的最大套接字数量可能会远小于此值。localhost连接同样会消耗此池中的套接字。使用 UDS 巧妙地避开了这个问题;它允许在不耗尽 TCP/IP 套接字的情况下进行通信。

服务端

新建 .NET 8 控制台项目,将 SDK 改成 Microsoft.NET.Sdk.Web,完整配置如下:

其中,greet.proto 配置如下:

代码如下:

编译启动后,如下图:

QQ截图20250811201748.jpg

客户端

再新建 .NET 8 控制台项目,引用如下类库:

调用 gRPC 接口的方法,调用 10次,每次调用完休眠 200 毫秒,代码如下:

启动项目,执行完成后,如下图:

QQ截图20250811202112.jpg

参考:

超链接登录可见。
超链接登录可见。




上一篇:Jetson(一)Jetson Orin Nano Super Developer Kit 开箱
下一篇:Spring Boot 中 Web 容器 netty 和 tomcat 比较
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 前天 20:57 | 显示全部楼层
HttpClient 使用 gRPC 和 Unix 域套接字通信

服务端

客户端

如下图:

QQ截图20250811205514.jpg
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 昨天 10:05 | 显示全部楼层
ProtocolType.Unspecified:未指定协议,由系统自动选择
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
 楼主| 发表于 昨天 11:02 | 显示全部楼层
c# 测试能够正常连接到 UDS


QQ截图20250812110156.jpg
码农网,只发表在实践过程中,遇到的技术难题,不误导他人。
您需要登录后才可以回帖 登录 | 注册[Register]

本版积分规则

免责声明:
码农网所发布的一切软件、编程资料或者文章仅限用于学习和研究目的;不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。本站信息来自网络,版权争议与本站无关。您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。如果您喜欢该程序,请支持正版软件,购买注册,得到更好的正版服务。如有侵权请邮件与我们联系处理。

Mail To:help@itsvse.com

QQ|手机版|小黑屋|架构师 ( 鲁ICP备14021824号-2 )|网站地图

GMT+8, 2025-8-13 19:24

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表