LINUX.ORG.RU

как правильно определять IP


0

0

Добрый день.

У меня интернет, к которому есть два сетевых интерфейса, eth0 - для локальной сети, и ppp0 (подключение через VPN по протоколу PPTP) - для удаленной. Если я захожу на локальные сервера, то who на них показывает мой IP в eth0, если на удаленные - то IP, который мне назначился в интерфейсе ppp0.

Вопросов два:

1) Каким образом выбирается интерфейс, через который устанавливается соединение?

2) Мне нужно в С-приложении получить свой локальный IP, а он в этих двух случаях должен выставляться по-разному. Как мне это сделать - чтоб IP выставлялся правильно независимо от того, захожу я на машины локальной сети или удаленной?

Большое спасибо!


ключевое слово - таблица маршрутов

Ex ★★
()

Кажется, я не очень точно сформулировал задачу. Мне нужно отправить SIP (Session Initiation Protocol) сообщение, в тексте которого я должен явно прописать свой IP адрес. И хочется, чтобы в обоих случаях я имел возможность вставить правильный IP адрес.

murla
() автор топика
Ответ на: комментарий от murla

Я не очень понял о чем речь, но может надо сокет приbindить к интерфейсу?

OxiD ★★★★
()

так и не догнал что требуется... если хочеш получить IP интерфейса то кури man 2 ioctl, man 2 ioctl_list на предмет SIOCGIFADDR

Ex ★★
()
Ответ на: комментарий от Ex

> так и не догнал что требуется... если хочеш получить IP интерфейса то
> кури man 2 ioctl, man 2 ioctl_list на предмет SIOCGIFADDR

Рисую :-)

 +-----------------+
 |     My host     |
 | +-------------+ |   +--------------------------+
 | |     eth0    |====>| Host from local network  |
 | | 192.168.x.x | |   |        192.168.y.y       |
 | +-------------+ |   +--------------------------+
 | +-------------+ |   +-----+   +--------------------------+
 | |     ppp0    |====>| VPN |==>| Host from remote network |
 | | 159.93.x.x  | |   +-----+   |        159.93.y.y        |
 | +-------------+ |             +--------------------------+
 +-----------------+

Дело в том, что мне заранее неизвестно, какой из интерфейсов будет
использоваться. Но я кое-где нашел следующий кусок:

    int sock_id;
    struct sockaddr_in serv_addr;

    sock_id = socket(AF_INET, SOCK_DGRAM, rtp_port);

    serv_addr.sin_family = AF_INET;
    serv_addr.sin_port = htons(rtp_port);
    serv_addr.sin_addr.s_addr = INADDR_ANY; /* auto-fill with server IP */
    bzero(serv_addr.sin_zero, sizeof(serv_addr.sin_zero));

    bind_status = bind(sock_id, &serv_addr, sizeof(serv_addr));

то есть, возможно, нужный мне IP, который указан как "auto-filled",
удастся "выудить" потом после отсылки какого-нибудь пакета? То есть,
мы ставим serv_addr.sin_addr.s_addr в INADDR_ANY (это нуль), а потом
он заполняется правильным IP? Однако, в man bind сказано, что
указатель на serv_addr передается с квалификатором const:

$ man bind
NAME
       bind - bind a name to a socket

SYNOPSIS
       #include <sys/types.h>
       #include <sys/socket.h>

       int   bind(int   sockfd,  const  struct  sockaddr  *my_addr,  socklen_t
       addrlen);

Ладно, буду пробовать. Если кто-то видит более изящный способ - подскажите, буду очень благодарен.

murla
() автор топика
Ответ на: комментарий от murla

>> Дело в том, что мне заранее неизвестно, какой из интерфейсов будет использоваться

да ну? маршруты теперь выбираются случайным образом? а routing table зачем тогда? :)

>> serv_addr.sin_addr.s_addr = INADDR_ANY

в данном случае s_addr == 0.0.0.0 т.е. сокет забиндится на все интерфейсы если при помощи ioctl получить ip адресс интерфейса (или указать вручную) и прописать его вместо INADDR_ANY то естественно сокет забиндится на интерфейс с этим ip

Ex ★★
()
Ответ на: комментарий от Ex

>> serv_addr.sin_addr.s_addr = INADDR_ANY

> в данном случае s_addr == 0.0.0.0 т.е. сокет забиндится на все интерфейсы если при помощи ioctl получить ip адресс интерфейса (или указать вручную) и прописать его вместо INADDR_ANY то естественно сокет забиндится на интерфейс с этим ip

А... можно то же самое, но со знаками препинания? :) Большое спасибо.

murla
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.