2008-09-23 1 views
0

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

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

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

Код находится в чистом C, написанном на Linux.

+0

Возможно, есть хороший способ решить любую проблему, которая, по вашему мнению, будет решена. Но это, вероятно, не самый правильный способ сделать это. – 2011-08-18 23:10:03

ответ

0

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

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

1

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

(хотя быстрый взгляд на/Lib/IPTables показывает, что вы можете быть в удаче)

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


Все это относится, пока я не заметить очевидный недостаток в схеме, хлопнуть свою голову и сказать: «D'ах!»

0

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

Смежные вопросы