Я реализовал службу, которая отправляет и получает данные через сокет tcp. Теперь на моей машине есть два сетевых интерфейса, на которых я должен запускать службу в двух сетях.
Как я могу указать, какой сетевой интерфейс для отправки данных? (Использование Boost :: asio или традиционных сокетов Berkeley или использование системного вызова для изменения таблицы маршрутизации ядра на лету)
Я не знаю о Boost, но в целом, если вы хотите отправить /recv с помощью определенного интерфейса, чем вам нужно bind()
сокет к этому IP-адресу интерфейса, или, альтернативно, на некоторых платформах вы можете использовать setsockopt(SOL_SOCKET, SO_BINDTODEVICE)
.
bind()
или setsockopt(SO_BINDTODEVICE)
перед вызовом connect()
. Принимая входящее соединение, оно автоматически связывается с тем сетевым интерфейсом / интерфейсом, который использовался для его принятия. Вы можете bind()
/ setsockopt(SO_BINDTODEVICE)
прослушивающий сокет с конкретным NIC / интерфейсом, или вы можете просто позволить ему связываться со всеми доступными NIC / интерфейсами, и он сообщит вам, какой из них принял каждое соединение.