LINUX.ORG.RU

Вопрос по сокетам.


0

2

Чегой-то меня походу в гугле забанили, а в фундаментальную литературу лезть пока лень. В общем вопрос: допустим к машине подключено несколько сетевых интерфейсов, eth0, eth1 .. ethN каждый со своим IP адресом. Есть ли возможность открыть клиентский сокет для соединения с сервером где-то в интернете - на определенном интерфейсе?

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

P.S. Язык реализации java, если это имеет какое-то значение. Переносимость решения можно ограничить unix-like системами.

★★★★
Ответ на: комментарий от mashina

дополнение: при условии правильно настроенных маршрутов в системе.

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

Обычно все дергают bind() на сервере, но мало кто знает что bind() можно дергать и на клиенте.

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

Обычно все дергают bind() на сервере, но мало кто знает что bind() можно дергать и на клиенте.

Ок, т.е. теоретически это возможно. Уже хорошо.

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

man route ещё почитай, может пригодится.

Про route я в курсе, но править под каждый запрос таблицу маршрутизации (а запросов будет десятки то точно в секунду) предполагается мне немного не вариантом.

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

в жаве тыж биндишшься на определенный локальный адрес, одному интерфейсу соответсвует один адрес, в чем собственно проблемы?

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

Эмм. В жаве вроде при создании клиентского соединения обычно делается так (если использовать nio):

SocketChannel socketChannel = SocketChannel.open();
socketChannel.connect(new InetSocketAddress(hostAddress, port));

И я в упор не вижу здесь задания _клиентского_ адреса, только серверного.

Nagwal ★★★★
() автор топика
Ответ на: комментарий от val-amart

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

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

> одному интерфейсу соответсвует один адрес

# ip addr list dev eth0
# ip addr add dev eth0 192.168.11.22/24 brd 192.168.11.255 scope global
# ip addr add dev eth0 192.168.33.44/24 brd 192.168.33.255 scope global
# ip addr add dev eth0 192.168.55.66/24 brd 192.168.55.255 scope global
# ip addr add dev eth0 192.168.77.88/24 brd 192.168.77.255 scope global
# ifconfig
# ip addr list dev eth0
# ping 192.168.11.22
# ping 192.168.33.44
# ping 192.168.55.66
# ping 192.168.77.88
arsi ★★★★★
()
Ответ на: комментарий от arsi

От ты тупить любишь, смотри

# ip addr add dev eth0 172.16.0.99 label eth0:g
# ifconfig                                     
eth0      Link encap:Ethernet  HWaddr ...
          inet addr:172.16.0.2  Bcast:172.16.0.255  Mask:255.255.255.0
....
eth0:g    Link encap:Ethernet  HWaddr ...
          inet addr:172.16.0.99  Bcast:0.0.0.0  Mask:255.255.255.255

вуаля, и вышел псевдоинетрфейс, разницу в командах видишь не?

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

> здесь наличествуют костыли

omg wtf? o_O где ты здесь костыли увидел? и линукс — далеко не единственная система, поддерживающая несколько адресов на одном интерфейсе. винда, например, точно умеет.

> кои также не оказывают влияние на java

какое это имеет отношение к «одному интерфейсу соответсвует один адрес»? ;)

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

> разницу в командах видишь не?

вижу, а ты? ;)

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

покажите мне систему, которая этого не умеет. если чо, мой пример был с соляры.

val-amart ★★★★★
()
Ответ на: комментарий от netch

Привет эстонским братьям линуксоидам? Или такой хитрый тактический ход отвечать через десять дней. Ну да ладно, читай что спрашивает ТС. Специально для тебя копипащу:

Переносимость решения можно ограничить unix-like системами.

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