AF_UNIX等效于Windows

时间:2012-01-27 05:01:30

标签: windows winapi sockets ipc porting

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

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

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

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

3 个答案:

答案 0 :(得分:5)

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/

答案 1 :(得分:3)

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

对于IP套接字,您提到了“可以在网络中看到”的问题。如果只是将服务器套接字绑定到本地主机地址(127.0.0.1),则情况并非如此。

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 :(得分:0)

我找到了答案。

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

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