2010-11-24 3 views
0

У меня есть 3 сетевых интерфейса на моей машине (eth0-2), каждый из которых имеет свою собственную сетевую подсеть 192.168.10. , 192.168.20., 192.168.30. . Мне было интересно, как использовать сокеты BSD на порту для конкретного сетевого адаптера, например прослушивать порт 10000 для eth1 (192.168.20.). На данный момент у меня есть, что похоже на список/привязку только к eth0 , OS, которую я сейчас использую, - Ubuntu, но я хотел бы, чтобы решение работало/переносилось в любой системе posix.привязка к конкретному сетевому адаптеру в порядке posix

На стороне заметки Я разрабатываю свое приложение на C++ и буду признателен за некоторые рекомендации по сетевым библиотекам на C++, я взглянул на Qt, однако лицензия не подходит для типа разработки. Я делает.

ответ

2

Системный вызов bind() позволяет указать адрес для привязки сокета. Вы можете привязываться к определенному адресу, или вы можете привязать к INADDR_ANY, который будет прослушивать все входящие адреса, независимо от интерфейса.

Что касается сетевых библиотек, boost :: asio - это хорошо. Конечно, вы можете указать больше требований, чем «сетевая библиотека», чтобы получить лучшую рекомендацию.

0

Если вы BIND одно прослушивание сокета всех IP-адресов на хосте (на порту 10000, например), я не считаю, что есть общий механизм для определения IP-адрес, на котором конкретный ACCEPT -ed соединение пришел.

Одним из решений является BIND отдельное гнездо для каждого из 3-х IP-адресов, а затем использовать ВЫБРАТЬ наблюдать для входящих соединений. Таким образом, вы всегда будете знать, какой входящий IP-адрес использовался.

В качестве альтернативы, если у вас есть полный контроль над протоколом на стороне клиента, вы можете спроектировать в требовании, чтобы клиент передавал целевой IP-адрес, который использовался сразу после установления соединения сокета. Это позволит вам использовать один серверный сокет для прослушивания всех входящих подключений, но вам потребуется доверять информации, которую клиент предоставляет.

+3

Вы можете использовать `getsockname()` для определения локального адреса, который использовался для сокета, возвращаемого `accept()`. – caf 2010-11-24 08:29:48

Смежные вопросы