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