2016-11-08 13 views
2

Когда я создаю пример Hello World в C++ из Руководства по ZeroMQ здесь: http://zguide.zeromq.org/page:all#Ask-and-Ye-Shall-ReceiveКак подавить оповещение безопасности Windows для брандмауэра Windows?

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

Это выглядит следующим образом: Screenshot

Вот где вещи становятся интересными.

Мне нужна только моя программа для прослушивания на порту 5555 для подключения с localhost, и я не хочу . НЕ необходимо разрешить входящие соединения на порту 5555. Это связано с тем, что я хочу общаться только между приложениями на локальном хосте.

Клиент и сервер работают на одном компьютере.

Вот мой текущий процесс. Я запускаю сервер, появляется предупреждение о безопасности Windows, так как я запускаю приложение как учетную запись, отличную от администратора, у меня есть только стандартные разрешения. Затем нажмите «Отмена» в «Оповещение».

При нажатии кнопки «Отмена» при оповещении явное запрещающее правило на всех портах для HelloWorldServer.exe. Это полностью штраф.

Затем я запускаю клиент. Поскольку клиент подключается к локальному хосту. На самом деле мне не нужно отправлять сообщения за пределами локального компьютера, и все его сообщения поступают на сервер просто отлично.

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

Теперь возникает вопрос, будет ли в любом случае автоматически отвечать на уведомление о безопасности Windows, чтобы нажать «Отменить»? Есть ли способ подавить его от всплытия, поскольку разрешение не нужно?

Запрос нежелателен, поскольку он подразумевает, что приложение должно создавать уязвимость, если это не так.

Предположим, что Named Pipes не являются допустимой альтернативой tcp как средству межпроцессного взаимодействия.

+0

Как вы связали слуховой разъем?Несмотря на то, что вы намерены использовать сокет с локальным хостом, если вы не привязываетесь правильно, он также позволит удалять соединения и запускать брандмауэр. Полезная запись здесь: [понимание INADDR_ANY для программирования сокетов - c] (http://stackoverflow.com/a/16510000/4581301) – user4581301

+0

'socket.bind (" tcp: // *: 5555 "); полный пример находится на http://zguide.zeromq.org/cpp:hwserver – ComradeJoecool

+0

Коэффициенты хороши, что '*' означает разрешить любой адрес, локальный или удаленный. Дайте 'socket.bind (" tcp: // localhost: 5555 ");' или 'socket.bind (" tcp: //127.0.0.1: 5555 ");' попытайтесь связать порт с локальным только трафиком. – user4581301

ответ

2

При привязке сокета вызывающий может указать IP-адрес, к которому привязан сокет. Образцы кодирования, предоставляемых ZeroMQ заданного

socket.bind ("tcp://*:5555"); 

, где * кажется, что будет указывать все возможные адреса (INADDR_ANY в BSD сокетов, полученный жаргоне), которые будут вызывать брандмауэр Windows, так как она позволяет удаленный и локальный адрес.

Вызов socket.bind с локальным адресом 127.0.0.1

socket.bind ("tcp://127.0.0.1:5555"); 

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