2012-01-27 165 views
10

我想知道如何使用在Windows上的行爲類似於Unix域套接字的東西。AF_UNIX相當於Windows

行爲是:一個進程將是一個「服務器」並接收來自其他進程的連接,並且它可以像TCP套接字那樣保留和使用來自不同進程的連接。

IP套接字不是解決方案,因爲它需要選擇一個端口,來自其他應用程序的進程可能需要選擇的端口,並且可能會在網絡中看到開放端口。
我不知道命名管道是否可以接收並保留多個客戶端,但我沒有看到如何區分不同的客戶端。而且它沒有提供一種方式來等待來自多個連接的數據,例如select。

一個古老的問題說到使用命名管道,但它沒有解釋如何使用命名管道來獲得所需的行爲。 AF_UNIX in windows
我沒有看到如何獲得特定客戶端的句柄。

回答

1

可能不是您想要聽到的答案,但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)); 
0

的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/