2014-10-09 2 views
0

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

Как я могу указать сетевой интерфейс для отправки данных? (Использование Boost :: asio или традиционных сокетов Berkeley или использование системного вызова для изменения таблицы маршрутизации ядра на лету)

+1

Что произойдет, если вы ничего не укажете? – egur

+0

@egur Ответ на запрос, отправленный из определенной подсети, будет отправлен обратно в неправильную подсеть. –

+0

это сильно намекает на неправильную конфигурацию сети. Исправьте конфигурацию сети, и вам не нужно будет указывать это явно. Таблицы маршрутизации Monkeypatching - это кстати. а не вариант из-за буферизации ядра. – dom0

ответ

0

Я не знаю о Boost, но, в общем, если вы хотите отправить/recv с помощью конкретный интерфейс, чем вам нужен bind() сокет на IP-адрес этого интерфейса, или, альтернативно, на некоторых платформах вы можете вместо этого использовать setsockopt(SOL_SOCKET, SO_BINDTODEVICE).

+0

Это будет получать соединения только по указанному адресу. –

+0

Почему это было приостановлено? ** Только ** способ отправки/приема данных TCP в * конкретной * сети - привязать TCP-сокет к * конкретному * NIC/интерфейсу. При создании исходящего соединения вы должны вызывать 'bind()' или 'setsockopt (SO_BINDTODEVICE)' перед вызовом 'connect()'. При приеме входящего соединения он автоматически привязан к тому, что NIC/интерфейс использовался для его принятия. Вы можете 'bind()'/'setsockopt (SO_BINDTODEVICE)' прослушивающий сокет для определенного NIC/интерфейса, или вы можете просто привязать его ко всем доступным сетевым адаптерам/интерфейсам, и он сообщит вам, какой из них принимал каждое соединение. –

+0

Я не делал downvote, но 'bind()' и 'SO_BINDTODEVICE' не являются синонимами. Когда сокет 'bind()' s на определенный адрес, сокет будет принимать пакеты, предназначенные только для этого адреса, а переданные пакеты будут использовать адрес в качестве исходного адреса. Ядро может по-прежнему маршрутизировать пакеты через интерфейсы, не связанные с адресом. С другой стороны, когда сокет использует 'SO_BINDTODEVICE', любые данные, отправленные в сокет, выходят из соответствующего интерфейса, и любые любые данные, полученные через сокет, гарантируют, что прибыли на соответствующий интерфейс. –

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