Можно ли привязать и прослушать один IP-адрес с помощью сокетов TCP / IP?(Linux / С) - PullRequest
4 голосов
/ 18 октября 2011

Я всегда использовал:

serv_addr.sin_addr.s_addr = htonl(INADDR_ANY);

, что означает, что я буду принимать соединения с любого интерфейса.Если я заменю INADDR_ANY на «192.168.0.1».Означает ли это, что я буду принимать соединения только с IP-адреса 192.168.0.1, или это означает, что я буду принимать соединения с интерфейса 192.168.0.1, на котором находится?

У меня сейчас ситуация, когда у меня несколькоклиенты (каждый с уникальным IP-адресом, но с одинаковым номером порта), пытающиеся подключиться к одному серверу.Могу ли я иметь несколько функций прослушивания (отдельных потоков), слушающих уникальный IP-адрес и порт?Или мне нужно принять какое-либо соединение и получить информацию о сети после того, как я соединился?


Изменить Чтобы дать больше разъяснений.

Если я скажу serv_addr.sin_addr.s_addr = inet_addr("192.168.0.1") и клиент с IP-адресом 192.168.0.2 пытается подключиться, команда listen отклонит это?

Ответы [ 2 ]

7 голосов
/ 18 октября 2011

Адрес привязки - это локальный адрес для прослушивания; Вы можете указать адрес локального интерфейса.

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

Обновление

Если я скажу serv_addr.sin_addr.s_addr = inet_addr ("192.168.0.1") и клиент с IP-адресом 192.168.0.2 пытается подключиться, будет прослушивать Команда отклонить это? Я хочу иметь возможность иметь несколько потоков, каждый обслуживание уникального IP-адреса.

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

Рискуя указывать мой возраст, я все еще предпочитаю использовать прослушивание / принятие / выбор для большинства кодов сокетов - это личный вкус, и да, это влияет на дизайн, когда речь идет о блокирующем / неблокирующем вводе-выводе, буферизации и т. д.

0 голосов
/ 18 октября 2011

Если я заменю INADDR_ANY на «192.168.0.1». Значит ли это, что я буду принимать соединения только с IP-адреса 192.168.0.1 или делает это значит я приму соединения с интерфейса 192.168.0.1 проживает?

Да

У меня сейчас ситуация, когда у меня есть несколько клиентов (каждый с уникальный IP-адрес, но тот же номер порта), пытаясь подключиться к одному сервер. Могу ли я иметь несколько функций прослушивания (отдельные темы) слушаете уникальный IP-адрес и порт? Или я должен принять любой подключиться и получить информацию о сети после подключения?

Да. Вы можете «разветвляться» (то есть создавать новый поток) для каждого соединения, которое вы хотите обработать, однако вам придется выполнить фильтрацию самостоятельно. Нет способа (который я знаю в API) выгрузить эту работу в стек.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...