Эквивалент AF_UNIX для Windows

Я хочу знать, как использовать что-то, что ведет себя как Unix Domain Socket в Windows.

Поведение: Процесс будет "сервером" и будет получать соединения от других процессов, и он может поддерживать и использовать соединения из разных процессов, как это делает сокет TCP.

IP-разъем не является решением, поскольку для его выбора требуется выбрать порт, для процессов из других приложений может потребоваться выбранный порт, а открытый порт можно увидеть в сети.
Я не знаю, могут ли именованные каналы получать и хранить несколько клиентов, но я не видел, как отличать разных клиентов. И он не обеспечивает способ ожидания данных из нескольких соединений с чем-то вроде select.

Старый вопрос говорит об использовании именованных каналов, но он не объясняет, как использовать именованные каналы для получения желаемого поведения. AF_UNIX в окнах
Я не видел, как получить дескриптор конкретного клиента.

Ответ 1

Я нашел ответ.

Большая разница заключается в том, что дескриптор ожидания соединения тот же, что и связь с клиентом. Я должен был бы создать новый именованный канал для сервера, ожидающего следующего клиента.

Литература:
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

Ответ 2

Вероятно, это не тот ответ, который вы хотите услышать, но COM является одним из нескольких стандартных механизмов для обеспечения взаимодействия между процессами в Windows. У него есть проблемы, которые раздражают разработчиков, но он работает достаточно хорошо для всех перечисленных вами требований.

Что касается IP-сокетов, вы упомянули проблему "можно увидеть в сети". Это не тот случай, если вы просто привязываете свой серверный сокет к адресу localhost (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));

Ответ 3

Недавно Windows (Windows 10 Insider build 17063) реализовала поддержку AF_UNIX, поэтому вы можете использовать ее в будущих строках Windows.

Однако не все это реализовано, нижеследующие функции не работают.

  • Тип дейтаграммы AF_UNIX (SOCK_DGRAM) или тип пакета пакета (SOCK_SEQPACKET).
  • Вспомогательные данные: реализация сокета Linux unix поддерживает передачу вспомогательных данных, таких как передача файловых дескрипторов (SCM_RIGHTS) или учетные данные ( "SCM_CREDENTIALS" ) через сокет. Нет поддержки для вспомогательных данных в реализации UNIX-сокета Windows.
  • Функция Autobind (подробнее см. раздел "sockaddr_un" ).
  • socketpair: socket socket socket API не поддерживается в Winsock 2.0.

Источник: https://blogs.msdn.microsoft.com/commandline/2017/12/19/af_unix-comes-to-windows/