Вручную выберите интерфейс TCP для отправки данных - PullRequest
0 голосов
/ 23 сентября 2008

У меня есть TCP-сервер, который прослушивает только определенный интерфейс. Я хочу, чтобы после вызова accept(), если входящее соединение было из подсети xxx.xxx.xxx.0, данные должны проходить через intf1, в противном случае данные должны отправляться через intf2, где мой сервер прослушивает.

Оба интерфейса имеют одинаковые настройки маршрута и приоритет. Все сети доступны с обоих интерфейсов.

Одним из выходов может быть добавление нового маршрута через intf1 с более высоким приоритетом, но я хочу, чтобы это было решение на основе кода.

Код написан на чистом C и написан на Linux.

Ответы [ 3 ]

1 голос
/ 23 сентября 2008

Хотя это не совсем опция C, которую вы ищете, возможно, вы можете использовать правило iptables после получения accept ().

(хотя быстрый просмотр / lib / iptables показывает, что вам может повезти)

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


Все это применимо до тех пор, пока я не укажу на очевидный недостаток схемы, хлопну себя по голове и скажу: «О!»

0 голосов
/ 23 сентября 2008

Вы можете изменить маршрут в своей программе с помощью rtnetlink . Вы можете изменить все параметры, которые вы хотите. Смотрите также netdevice .

0 голосов
/ 23 сентября 2008

К сожалению, ваши параметры ограничены, так как стек TCP / IP реализован в ядре, а ваш интерфейс - таблица маршрутизации. Лучше всего вручную назначить маршрут.

Вы также можете использовать библиотеку netlink для добавления / удаления маршрутов «на лету», но некоторая часть пакетов TCP будет проходить через «неправильный» интерфейс, пока не будет выполнен вызов. Вероятно, вы столкнетесь с проблемами маршрутизации, когда ваши пакеты с адресом исходного интерфейса будут отправлены через другой интерфейс.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...