Сокеты против именованных каналов для локального IPC в Windows? - PullRequest
20 голосов
/ 17 ноября 2009

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

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

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

Ответы [ 2 ]

17 голосов
/ 04 декабря 2009

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

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

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

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

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

5 голосов
/ 16 июля 2011

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

...