Укажите вручную, какой сетевой интерфейс для отправки данных

0

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

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

  • 1
    Что произойдет, если вы ничего не укажете?
  • 0
    @egur Ответ на запрос, отправленный из определенной подсети, будет отправлен обратно в неправильную подсеть.
Показать ещё 6 комментариев
Теги:
sockets
network-programming
boost-asio

1 ответ

0

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню