Я пытаюсь установить выходной интерфейс сокета в системе с двумя интерфейсами. Я много гугл, и я нашел разные ответы. Некоторые люди говорят, что я могу bind
сокет, прежде чем звонить connect
, чтобы выбрать конкретный интерфейс (как в How does a socket know which network interface controller to use?). Но другие люди говорят, что этого недостаточно (как в http://codingrelic.geekhold.com/2009/10/code-snippet-sobindtodevice.html или How to open a socket on a specific interface and receive both IPv4 and IPv6 traffic).Выбор интерфейса выхода сокета: SO_BINDTODEVICE vs bind перед подключением
У меня есть рабочая реализация с использованием SO_BINDTODEVICE
. Однако решение bind
перед connect
не работает. Похоже, что адрес источника не влияет на маршрутизацию, и в этом случае рассматривается только таблица маршрутизации. Кто-то сказал, что это вызвано моделью слабых конечных систем Linux. Согласно http://wiki.treck.com/Appendix_C:_Strong_End_System_Model_/_Weak_End_System_Model, адрес источника не задает выходной интерфейс.
Если возможно, я хотел бы иметь портативное решение. Я знаю, что SO_BINDTODEVICE
доступен только в Linux.
Я запускаю тестовое связывание с интерфейсом со связыванием. Он должен работать, вы должны показать свой код, чтобы выяснить, где проблема. – rodolk