Windows的AF_UNIX等效实现方式

18

我想知道如何在Windows上使用类似Unix域套接字的东西。

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

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

一个旧问题提到了使用命名管道,但它并没有解释如何使用命名管道来获得所需的行为。在Windows中使用AF_UNIX
我没有看到如何获得特定客户端的句柄。

3个回答

17

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

然而,并非所有的功能都被实现了,以下是不起作用的功能:

  • AF_UNIX 数据报 (SOCK_DGRAM) 或序列包 (SOCK_SEQPACKET) 套接字类型。
  • 辅助数据:Linux 的 unix socket 实现支持传递辅助数据,例如传递文件描述符 (SCM_RIGHTS) 或凭证 (‘SCM_CREDENTIALS`)。Windows unix socket 实现中没有对辅助数据的支持。
  • 自动绑定功能(有关 "sockaddr_un" 部分的详细信息,请参见)。
  • socketpair:Winsock 2.0 不支持 socketpair 套接字 API。

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


3
也许这不是你想听到的答案,但COM是Windows中几种标准机制之一,用于实现进程间通信。虽然它有一些令开发人员困扰的问题,但对于你列出的所有要求,它表现得非常好。
至于IP套接字,你提到了“可以在网络中看到”的问题。如果将服务器套接字简单地绑定到本地地址(127.0.0.1),则不会出现这种情况。(2021免责声明 - 请参见下面的评论中的潜在漏洞)。
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));

2
绑定到本地主机并不完全安全,因为Javascript可以向本地主机的端口发送HTTP请求,即使它是从公共网站加载的。这在最近几年中咬了许多开发人员,包括一些应该更好地了解安全性的安全专家。 - al45tair
1
通过使用非 HTTP 或 WebSocket 协议,并选择随机端口,可能会缓解 localhost 问题。但仍有可能被端口扫描或页面干扰。戴尔电脑曾经在这方面存在巨大的安全漏洞。 (https://billdemirkapi.me/remote-code-execution-on-most-dell-computers/) - selbie
1
我的一般建议是,如果你需要一个本地套接字,请不要让它持续监听。在你需要它的时候立即以监听模式打开,并对传入连接进行一些安全性措施(例如,验证本地生成的密码或安全令牌以进行传入连接)。 - selbie
1
@FelixSchütz 问题在于你所接收到的Javascript可能是恶意的,而且可能来自一个恶意域名,其CORS设置和DNS被故意设置为Javascript代码可以访问localhost。CORS可以防止脚本注入攻击,但它不能防止从实际服务器故意提供的恶意内容。 - al45tair
显示剩余4条评论

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接