Страница 1 из 1

Вешаться на определенный интерфейс

Добавлено: 2010-11-17 19:06:39
pazlo
Доброе время суток! Не подскажите, если ли под никсы или окна софтина, которая могла бы биндить софтину на определенный интерфейс.
Вот например: есть прога XXX, она простая и написана так, что не рассчитана на использование конкретного интерфейса, а биндится сразу на все. Мне надо чтоб она могла биндится, скажем на eth1.

Код: Выделить всё

# if_binder /usr/bin/XXX eth1
Т.е. что-то типа такой команды чтоб было:)

Очень благодарю за ответ:)

Re: Вешаться на определенный интерфейс

Добавлено: 2010-11-17 19:16:06
pazlo
Можно в принципе фаером все разрулить, но мне надо именно так:) Кстати, забыл уточнить: не на интерфейс, а на ip. А то ведь у интерфейсов могут быть еще и алиасы.

Re: Вешаться на определенный интерфейс

Добавлено: 2010-11-17 21:18:44
hizel
написать обертку вокруг socket функций и подсунуть программе

Re: Вешаться на определенный интерфейс

Добавлено: 2010-11-17 21:25:20
hizel

Re: Вешаться на определенный интерфейс

Добавлено: 2010-11-18 5:43:48
pazlo
hizel писал(а):по аналогии с http://www.linux.org.ru/forum/admin/3367875
Спасибо большое за совет, почти помогло:) А как быть если прога использует 2 порта?

Re: Вешаться на определенный интерфейс

Добавлено: 2010-11-18 6:27:46
pazlo
Разобрался! bind вызывается каждый раз при биндинии порта. Я просто не программист, поэтмоу не сразу понял что к чему. Выложу на всякий случай исходник, который юзаю у себя:

Код: Выделить всё

#define _GNU_SOURCE

#include <stdio.h>
#include <string.h>

#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <dlfcn.h>

typedef int (* BindFn)(int s, const struct sockaddr *a, socklen_t al);
int port=10000; //сюда вписываем слушаемый порт
int bind(int s, const struct sockaddr *a, socklen_t al)
{
   port++; // делаем port+1
   BindFn real_bind_fn = dlsym(RTLD_NEXT, "bind");

   if (a->sa_family == AF_INET)
   {
      struct sockaddr_in new_addr;

      memcpy(&new_addr, a, sizeof(*a));
      new_addr.sin_port = htons(port /* Your port here */);

      return real_bind_fn(s, (const struct sockaddr *)&new_addr, al);
   }

   return real_bind_fn(s, a, al);
}

Идея проста как 3 пальца!:) Также знающему исходник не сложно дописать так, чтоб биндилась прога на разные порты, не отличающиеся на 1. А мне хватило и этого! Спасибо за ответы!

Re: Вешаться на определенный интерфейс

Добавлено: 2010-11-18 9:15:10
hizel
разве вам не нужно на одпределенный ip вешать?
типа

Код: Выделить всё

new_addr.sin_addr.s_addr = htonl('192.168.0.1')