AF_UNIX相当于Windows
我想知道如何使用在Windows上的行为类似于Unix域套接字的东西。AF_UNIX相当于Windows
行为是:一个进程将是一个“服务器”并接收来自其他进程的连接,并且它可以像TCP套接字那样保留和使用来自不同进程的连接。
IP套接字不是解决方案,因为它需要选择一个端口,来自其他应用程序的进程可能需要选择的端口,并且可能会在网络中看到开放端口。
我不知道命名管道是否可以接收并保留多个客户端,但我没有看到如何区分不同的客户端。而且它没有提供一种方式来等待来自多个连接的数据,例如select。
一个古老的问题说到使用命名管道,但它没有解释如何使用命名管道来获得所需的行为。 AF_UNIX in windows
我没有看到如何获得特定客户端的句柄。
我找到了答案。
最大的区别在于等待连接的句柄与通信到客户端的句柄相同。我将不得不为服务器创建一个新的命名管道,以等待下一个客户端。
参考文献:
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
可能不是您想要听到的答案,但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));
的Windows最近(10的Windows内幕建设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/