boost::asio - Уточнение по привязке к конкретному сетевому интерфейсу

Я искал в сети ответы, но я не могу найти полный ответ.

Сценарий: у меня есть клиентский API и сервер. Приложение использует клиентский API для связи с сервером. И TCP, и UDP используются для связи между клиентским API и сервером. Все это было написано с использованием ASIO.

Клиентский API подключается к серверу через TCP, затем отправляет команды через TCP и получает ответы через TCP. Клиентский API также прослушивает UDP-адрес, откуда постоянно получает данные в реальном времени.

Среда представляет собой смесь машин, работающих под управлением WIN32 и WIN64. Все машины также имеют 2 сетевые карты.

Вопрос: Я хотел бы иметь возможность «привязывать» свои соединения TCP и UDP к определенным интерфейсам локальной сети. Я видел некоторую информацию, в которой обсуждается параметр сокета SO_BINDTODEVICE, а также функция привязки из более ранних сообщений или других сайтов.

Можно ли это сделать в среде WIN32/64? Если бы вы могли пролить свет на это, некоторые примеры или полезные сайты, я был бы очень признателен.

Ссылки, которые я нашел:

  1. Использование Linux, как указать, какой Ethernet данные интерфейса передаются на
  2. http://tuxology.net/2008/05/15/forcing-connections-through-a-specific-interface/

person skimobear    schedule 25.08.2010    source источник
comment
для меня было неочевидно, пытались ли вы связать свои объекты acceptor с определенным endpoint с помощью одного из перегруженных конструкторов. Вы пробовали это?   -  person Sam Miller    schedule 26.08.2010
comment
Сэм, я не пробовал перегруженный конструктор. Я попробую это сегодня вечером и дам вам знать. Похоже, это должно сработать для tcp-сервера. Я надеюсь сделать это для клиента tcp, клиента udp и сервера udp. Если они возможны. Могу ли я использовать метод привязки и для них? Спасибо, отпишусь о результате.   -  person skimobear    schedule 26.08.2010
comment
Я разместил ответ ниже с примером кода, попробуйте и дайте мне знать.   -  person Sam Miller    schedule 26.08.2010


Ответы (1)


Вы можете привязаться к определенной конечной точке, используя соответствующий tcp::ip::acceptor конструктор

include <boost/asio.hpp>

int
main()
{
    using namespace boost::asio;
    io_service service;
    ip::tcp::endpoint ep(
            ip::address::from_string( "127.0.0.1" ),
            1234
            );
    ip::tcp::acceptor acceptor( 
            service,
            ep
            );
}
person Sam Miller    schedule 26.08.2010