适用于 Windows 的 AF_UNIX [重复]

Posted

技术标签:

【中文标题】适用于 Windows 的 AF_UNIX [重复]【英文标题】:AF_UNIX equivalent for Windows [duplicate] 【发布时间】:2012-02-20 04:46:35 【问题描述】:

我想知道如何在 Windows 上使用类似于 Unix Domain Socket 的东西。

行为是:一个进程将是一个“服务器”并接收来自其他进程的连接,它可以保持和使用来自不同进程的连接,就像 TCP 套接字一样。

IP套接字不是一个解决方案,因为它需要选择一个端口,来自其他应用程序的进程可能需要选择的端口,并且在网络中可能会看到打开的端口。 我不知道命名管道是否可以接收并保留多个客户端,但我没有看到如何区分不同的客户端。而且它没有提供一种方法来等待来自多个连接的数据,例如 select。

一个老问题是关于使用命名管道的,但它没有解释如何使用命名管道来获得所需的行为。 AF_UNIX in windows 我没有看到如何获取特定客户端的句柄。

【问题讨论】:

【参考方案1】:

Windows 最近(Windows 10 Insider build 17063)实现了对 AF_UNIX 的支持,因此您可以在未来的 Windows 版本中使用它。

但并非全部实现,以下功能不起作用。

AF_UNIX 数据报 (SOCK_DGRAM) 或序列数据包 (SOCK_SEQPACKET) 套接字类型。 辅助数据:Linux 的 unix 套接字实现支持传递辅助数据,例如传递文件描述符 (SCM_RIGHTS) 或 通过套接字的凭据(‘SCM_CREDENTIALS’)。没有支持 用于 Windows Unix 套接字实现中的辅助数据。 自动绑定功能(有关详细信息,请参阅“sockaddr_un”部分)。 socketpair:在 Winsock 2.0 中不支持 socketpair 套接字 API。

来源:https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows/

【讨论】:

【参考方案2】:

可能不是你想听到的答案,但COM 是在 Windows 中实现进程间通信的几种标准机制之一。它有让开发人员烦恼的问题 - 但它可以很好地满足您列出的所有要求。

关于IP套接字,您提到了“可以在网络中看到”的问题。如果您只是简单地将服务器套接字绑定到 localhost 地址 (127.0.0.1),则情况并非如此。 (2021 免责声明 - 存在潜在漏洞 - 请参阅下面的 cmets。

SOCKET s;
const DWORD LOCAL_HOST_IP = 0x7f000001; // 127.0.0.1
sockaddr_in addrLocal = ;
   
s = socket(AF_INET, SOCK_STREAM, 0);
addrLocal.sin_family = AF_INET;
addrLocal.sin_port = htons(YOUR_APPLICATION_PORT);
addrLocal.sin_addr.s_addr = htonl(LOCAL_HOST_IP);
s = SOCKET(AF_INET, SOCK_STREAM, 0);
bind(s, (sockadr*)&addrLocal, sizeof(addrLocal));

【讨论】:

由于 javascript 的原因,绑定到 localhost 并不是 100% 安全的(它可以将 HTTP 请求发送到 localhost 上的端口,即使它是从公共网站加载的)。近年来,这已经困扰了许多开发人员,包括一些应该更了解的安全人员。 @FelixSchütz - alstair 实际上是正确的。虽然恶意攻击者无法远程连接到我在 localhost 上运行的套接字,但在我的浏览器中本地运行的 javascript 绝对可以。例如,假设您访问 www.badbuys.com。他们所要做的就是有一个指向 127.0.0.1 的 localhost.badguys.com 的 dns 条目,并且他们的网页可以扫描端口扫描您的计算机。 ebay was actually doing exactly this - 据说用于扫描受感染的机器。 您可以通过使用不基于 HTTP 或 websocket 的自定义协议来缓解 localhost 问题。并选择随机端口。但是您仍然可以被端口扫描和/或页面中断您。 Dell computers had a huge security hole 围绕这个。 我现在的一般建议是,如果您需要 localhost 套接字,请不要让它持续监听。在需要时立即以侦听模式打开它,并对传入连接有一定的安全性(例如,为传入连接验证本地生成的密码或安全令牌)。 @FelixSchütz 问题是您所提供的 Javascript 可能是恶意的,并且可能来自恶意域,其 CORS 设置和 DNS 是故意设置的,以便 Javascript 代码可以访问本地主机。 CORS 可以防止脚本注入攻击;它不能防止从实际服务器故意提供的恶意内容。【参考方案3】:

我找到了答案。

最大的区别在于等待连接的句柄与与客户端进行通信的句柄相同。我必须为服务器创建一个新的命名管道以等待下一个客户端。

参考资料:http://msdn.microsoft.com/en-us/library/windows/desktop/aa365799%28v=vs.85%29.aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365588%28v=vs.85%29.aspxhttp://msdn.microsoft.com/en-us/library/windows/desktop/aa365603%28v=vs.85%29.aspx

【讨论】:

以上是关于适用于 Windows 的 AF_UNIX [重复]的主要内容,如果未能解决你的问题,请参考以下文章

我无法安装/启动适用于 Windows 7 64 位的 Android Studio [重复]

如何在容器上编辑 Docker 端口和参数? (使用适用于 Windows 的 Docker 桌面)[重复]

如何在 c++ 中创建一个适用于 Windows 和 linux 的文件夹(目录)[重复]

适用于 XP 的 Windows 防火墙规则

在哪里获得适用于 Linux 的 msbuild [重复]

从 kivy/python 程序创建适用于 Android 的 APK [重复]