URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 2664
[ Назад ]

Исходное сообщение
"Добавление маршрута под линуксом"

Отправлено ec , 15-Мрт-04 12:59 
Не поделится ли кто примером, как на Си под Linux'ом добавить в ядро маршрут?

Содержание

Сообщения в этом обсуждении
"Добавление маршрута под линуксом"
Отправлено ovax , 16-Мрт-04 02:21 
>Не поделится ли кто примером, как на Си под Linux'ом добавить в
>ядро маршрут?

Хм.. а зачем в ядро-то ?
не достаточно будет просто системе передать команду
/sbin/route add .......  ?



"Добавление маршрута под линуксом"
Отправлено fefelov , 16-Мрт-04 10:30 
http://libdnet.sourceforge.net/


"Добавление маршрута под линуксом"
Отправлено Dmitry Labutcky , 23-Мрт-04 17:39 
Hi!

>Не поделится ли кто примером, как на Си под Linux'ом добавить в
>ядро маршрут?

да запросто:

#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <sys/ioctl.h>
#include <net/route.h>
#include <netinet/in.h>
#include <unistd.h>
#include <arpa/inet.h>

extern int errno;

int main(int argc, char **argv)
{
struct rtentry route_entry;
struct sockaddr_in sa;
const char *route_dst = "1.2.3.4";
const char *route_mask = "255.255.255.0";
const char *route_gw = "1.2.2.4";

int sock_fd;

if ( (sock_fd = socket(PF_INET, SOCK_DGRAM, IPPROTO_IP)) == -1)
{
  printf("Error opening socket. %d: %s\n", errno, strerror(errno));
  return -1;
}

memset((void *)&route_entry, 0, sizeof(route_entry));

sa.sin_family=AF_INET;
sa.sin_addr.s_addr=inet_addr(route_dst);
memcpy(&route_entry.rt_dst, &sa, sizeof(sa));
sa.sin_addr.s_addr=inet_addr(route_gw);
memcpy(&route_entry.rt_gateway, &sa, sizeof(sa));
sa.sin_addr.s_addr=inet_addr(route_mask);
memcpy(&route_entry.rt_genmask, &sa, sizeof(sa));
route_entry.rt_flags=RTF_UP|RTF_GATEWAY;
route_entry.rt_metric=1;

if (ioctl(sock_fd, SIOCADDRT, &route_entry) == -1)
printf("Error %d: %s\n", errno, strerror(errno));

close(sock_fd);

return 0;
}