2017-02-15 9 views
7

Я очень новичок в статической маршрутизации, наш клиент попросил реализовать статическую маршрутизацию для сокетов. Когда я googled, я столкнулся с rtentry, чтобы установить информацию о маршрутизации. Когда я открыл эту структуру, я видел поля для статической маршрутизациейКак настроить несколько записей маршрутизации для сокета?

struct sockaddr rt_dst;  /* Target address. */ 
struct sockaddr rt_gateway;  /* Gateway addr (RTF_GATEWAY). */ 
struct sockaddr rt_genmask;  /* Target network mask (IP). */ 

Но как я могу настроить многократную здесь? создание нескольких rtentry и вызов ioctl(FileDes, SIOCADDRT, &rtentry) исправить мою проблему?

int32_t FileDes = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 
for(auto RtEntry : RtEntriesList) 
{ 
    ioctl(FileDes, SIOCADDRT, RtEntry)` 
} 

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

+0

Gilson, можете ли вы расширить «клиент, запрошенный для реализации статической маршрутизации для сокетов», часть вашего вопроса более подробно? У сокетов обычно нет никакого дополнительного выбора маршрутизации, они просто используют общесистемную определенную маршрутизацию; и rtentry не для обычных сокетов, для административных сокетов можно получить и установить общесистемную маршрутизацию (используется привилегированной командой «добавить маршрут»: http://unix.stackexchange.com/questions/274094/can-not -Добавить-статический-маршрут-в-моей-Ubuntu-siocaddrt-сеть-это-недостижим). – osgx

+0

@osgx мы должны изменить файл/etc/network/interface, чтобы обеспечить статическую маршрутизацию. Мне ясно, что эта часть также должна установить эту информацию о маршрутизации в интерфейс, чтобы она выполняла конфигурацию без перезапуска. Для этого мы должны установить информацию о маршрутизации через административные сокеты. Поэтому я смущен, как установить эту информацию. Они не хотят выполнять команду маршрута или перезапускают устройство для установки конфигурации статической маршрутизации. Надеюсь, вы ясно знаете мой вопрос. –

+0

Gilson, проверьте источники маршрутов 'route' или [' ip route'] (https://access.redhat.com/sites/default/files/attachments/rh_ip_command_cheatsheet_1214_jcs_print.pdf) tools (sourceforge.net/projects/net-tools ,) и/или 'strace' /' ltrace'/'sysdig' команд' route add', которые используются для установки нужной маршрутизации. – osgx

ответ

3

Наконец-то я получил ответы.

int32_t FileDes = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP); 

struct rtentry Route1; 
struct rtentry Route2; 
struct rtentry Route3; 

// configure Route1 
// configure Route2 
// configure Route3 

RtEntriesList.push_back(&Route1); 
RtEntriesList.push_back(&Route2); 
RtEntriesList.push_back(&Route3); 

for(auto RtEntry : RtEntriesList) 
{ 
    ioctl(FileDes, SIOCADDRT, RtEntry); 
} 

будет работать, мы можем создать многопозиционные записи маршрутизации и добавить к сокету FD. и это обновит таблицу маршрутизации в системе.

его похожим на route add .. команды

для тестирования я установить шлюз, как мой ПК IP-адрес и начал Wireshark там. после настройки конфигурации маршрутизации заданный диапазон IP направляется на мой компьютер. Спасибо @osgx за информацию о том, что она фактически устанавливает таблицу маршрутизации в системе.