Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
适用于Windows的AF_UNIX等效程序_Windows_Winapi_Sockets_Ipc_Porting - Fatal编程技术网

适用于Windows的AF_UNIX等效程序

适用于Windows的AF_UNIX等效程序,windows,winapi,sockets,ipc,porting,Windows,Winapi,Sockets,Ipc,Porting,我想知道如何在Windows上使用类似Unix域套接字的东西 其行为是:一个进程将是一个“服务器”,接收来自其他进程的连接,它可以像TCP套接字那样保持和使用来自不同进程的连接 IP套接字不是一个解决方案,因为它需要选择一个端口,来自其他应用程序的进程可能需要选择的端口,并且在网络中可以看到打开的端口。 我不知道命名管道是否可以接收和保留多个客户端,但我不知道如何区分不同的客户端。而且它不提供一种使用类似select的方法来等待来自多个连接的数据 一个老问题是关于使用命名管道的,但它没有解释如何

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

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

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

一个老问题是关于使用命名管道的,但它没有解释如何使用命名管道来获得所需的行为

我没有看到如何处理特定客户端。

可能不是您想要听到的答案,但它是在Windows中实现进程间通信的几种标准机制之一。它有一些困扰开发人员的问题,但是对于您列出的所有需求,它都能很好地工作

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


我找到了答案

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

参考文献:


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

但是,并不是所有的功能都实现了,下面的功能不起作用

  • AF_UNIX数据报(SOCK_DGRAM)或序列数据包(SOCK_SEQPACKET)套接字类型
  • 辅助数据:Linux的unix套接字实现支持传递辅助数据,例如传递文件描述符(
    SCM\u权限
    )或 套接字上的凭据(“SCM\U凭据”)。没有支持 用于Windows unix套接字实现中的辅助数据
  • 自动绑定功能(有关详细信息,请参阅“sockaddr__n”一节)
  • socketpair:Winsock 2.0不支持socketpair套接字API

来源:

但是绑定到localhost并不是100%安全的,因为Javascript(它可以向localhost上的端口发送HTTP请求,即使它是从公共网站加载的)。近几年来,这让许多开发商感到痛苦,其中包括一些应该更了解安全的人。
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));