Подтвердить что ты не робот

Сокеты против именованных каналов для локального IPC в Windows?

Есть ли какие-либо причины для поддержки именованных каналов через сокеты для локального IPC (оба с использованием win-api), эффективности-wize, resource-wize или иначе, так как оба ведут себя очень похожи (и могут быть абстрагированы с помощью аналогичного интерфейса в любом случае), в приложении, которое, вероятно, уже использует сокеты для сетевых целей?

Я могу назвать по крайней мере проблему адресации: номера портов для сокетов против имен файлов для труб. Кроме того, именованные каналы (AFAIK) не будут уведомлять брандмауэр (диалог блокировки/разблокировки), хотя заблокированные приложения могут все время связываться через сокеты локально. Что еще нужно учитывать?

В случае использования сокетов, есть ли какие-либо настройки/флаги winsock, рекомендуемые при локальном использовании сокетов?

4b9b3361

Ответ 1

Некоторые тонкие отличия:

Сокеты не будут работать для локального IPC, если у вас нет функционального адаптера. Насколько распространено это иметь ПК без функционирующего адаптера? Ну, меня укусили, когда кто-то пытался продемонстрировать наше программное обеспечение клиенту на ноутбуке, который не был подключен к сети или источнику питания (поэтому ОС отключила сетевую карту для экономии энергии), и беспроводной адаптер был отключен (потому что пользователь ноутбука не использовал беспроводную связь). Вы можете обойти это, установив loopback-адаптер, но это не идеально.

Программное обеспечение брандмауэра может вызвать проблемы с установлением соединений TCP/IP. Это не должно быть проблемой для локального IPC, но я не уверен. Именованные каналы могут также иметь брандмауэры.

У вас могут быть проблемы из-за привилегий, необходимых для создания именованных каналов, или для создания новых экземпляров именованных каналов. Например, я запускал несколько серверов с использованием одного и того же именованного канала (возможно, это была не очень хорошая идея, но это было для тестирования), а некоторые из них были неудачны в CreateNamedPipe, потому что первый сервер для создания канала работал в режиме администратора (потому что он был запущен с Visual Studio в режиме администратора), а остальные были запущены из командной строки с нормальным уровнем UAC.

Хотя статья, упомянутая Rubens, в основном касается IPC по сети, она делает вывод о том, что "Локальные именованные каналы работают в режиме ядра и работают очень быстро".

Ответ 2

Еще одно решение, которое вы, возможно, захотите рассмотреть, - это именованная область общей памяти. Это небольшая работа, потому что вам необходимо самостоятельно установить протокол управления потоком, но я использовал это в прошлом, когда скорость была самой важной.