Предыдущая тема :: Следующая тема |
Автор |
Сообщение |
Jolik
Зарегистрирован: 31.03.2004 Сообщения: 56
|
Добавлено: Пт Фев 17 2006 14:22 Заголовок сообщения: Проблема с бродкаст пакетами... |
|
|
Есть компьютер с двумя сетевыми карточками №1 и №2. Карточка №1 не подключена к сети, карточка №2 подключена. На карточке №1 установлен статический адрес 192.168.238.238, на карточке №2 - адрес динамический 192.168.0.1. Посылаю с этой машины бродкаст UDP пакеты которые получаю на другой машине подключенной к сети 192.168.0.х и у них в качестве адреса отправителя стоит адрес 192.168.238.238. При отправке бродкаст UDP пакетов bind сокету не делаю - UDP не требует этого. По моему мнению - если комп кидает пакеты в интерфейс №2 (а раз я получаю пакеты в сети 192.168.0.х - значит так и есть) то и обратный адрес он должен устанавливать этого же интерфейса (т.е. 192.168.0.1) - почему же этого не происходит?
Заранее благодарен! |
|
Вернуться к началу |
|
|
Andrew Grekhov
Зарегистрирован: 29.06.2005 Сообщения: 200
|
Добавлено: Пт Фев 17 2006 14:47 Заголовок сообщения: |
|
|
Напортачили с маршрутизацией.
Команда route |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 17 2006 15:22 Заголовок сообщения: |
|
|
Andrew Grekhov
Несколько поспешное заявление...
C маршрутизацией норма.
Jolik
Цитата: | По моему мнению - если комп кидает пакеты в интерфейс №2 (а раз я получаю пакеты в сети 192.168.0.х - значит так и есть) то и обратный адрес он должен устанавливать этого же интерфейса (т.е. 192.168.0.1) - почему же этого не происходит? |
Дело в том, что сначала происходит формирование пакета (в том числе и адрес отправителя), затем идет обращение к таблице маршрутизации, чтобы выяснить кому послать пакет (на шлюз по умолчанию или непосредственно получателю) и через какой интерфейс.
Проблемы с программой, которая формирует пакет. _________________ Знание принципов компенсирует незнание фактов. |
|
Вернуться к началу |
|
|
gleb185
Зарегистрирован: 17.02.2006 Сообщения: 8
|
Добавлено: Пт Фев 17 2006 15:32 Заголовок сообщения: |
|
|
маска /24 на обоих интерфейсах? |
|
Вернуться к началу |
|
|
Jolik
Зарегистрирован: 31.03.2004 Сообщения: 56
|
Добавлено: Пт Фев 17 2006 16:32 Заголовок сообщения: Ответы: |
|
|
1. маска одинаковая /24
2. route бродкаст не дает корректировать (узел 255.255.255.255
)
3. прикладная программа передающая то не может указывать адрес отправителя - это WinSock же выдает при вызове recvfrom() |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 17 2006 17:07 Заголовок сообщения: |
|
|
Цитата: | прикладная программа передающая то не может указывать адрес отправителя |
Может ошибаюсь, давно не программировал. Но рискну:
- создаем socket
- получаем список всех IP нашего компа
- делаем bind с нужным нашим адресом (отправителя)
- sendto на бродкаст
---
Вроде так. Если не прав, надеюсь знающие поправят. _________________ Знание принципов компенсирует незнание фактов. |
|
Вернуться к началу |
|
|
Jolik
Зарегистрирован: 31.03.2004 Сообщения: 56
|
Добавлено: Пт Фев 17 2006 17:13 Заголовок сообщения: Все верно... |
|
|
Andy_user писал(а): | Цитата: | прикладная программа передающая то не может указывать адрес отправителя |
Может ошибаюсь, давно не программировал. Но рискну:
- создаем socket
- получаем список всех IP нашего компа
- делаем bind с нужным нашим адресом (отправителя)
- sendto на бродкаст
---
Вроде так. Если не прав, надеюсь знающие поправят. |
Думаю если так сделать - будет все работать. Просто не хотелось бы так гимороиться - получать список интерфейсов и пр. Тем более, что в большинстве случаев (когда на компе одна карточка) все работает Думаю, что это глюк в винде Еще думаю, что если бы была возможность в route снести путь 255.255.255.255 к ненужно карточке - тоже все бы заработало
Может еще какие мысли есть? |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 17 2006 17:19 Заголовок сообщения: |
|
|
Цитата: | Тем более, что в большинстве случаев (когда на компе одна карточка) все работает Думаю, что это глюк в винде |
Конечно работает.
Насчет глюка - не надо...
При наличии нескольких IP привязка сокета по bind() происходит по первому сетевому интерфейсу из списка.
Попробуйте:
- нужную Вам сетевую карту - на самый верх в списке;
- отключить ненужную. _________________ Знание принципов компенсирует незнание фактов. |
|
Вернуться к началу |
|
|
Jolik
Зарегистрирован: 31.03.2004 Сообщения: 56
|
Добавлено: Пт Фев 17 2006 17:26 Заголовок сообщения: Согласен... |
|
|
Andy_user писал(а): | Цитата: | Тем более, что в большинстве случаев (когда на компе одна карточка) все работает Думаю, что это глюк в винде |
Конечно работает.
Насчет глюка - не надо...
При наличии нескольких IP привязка сокета по bind() происходит по первому сетевому интерфейсу из списка.
Попробуйте:
- нужную Вам сетевую карту - на самый верх в списке;
- отключить ненужную. |
Другое дело - как назвать, если не глюком,, что пакет уходит через один интерфейс, а адрес отправителя - от другого...
интересно было бы проверить это на линуксе |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 17 2006 17:30 Заголовок сообщения: |
|
|
Думаю, будет так же.
Работа с сокетами в винде содрана с *nix систем.
Еще раз напомню:
Формирование пакета идет раньше, затем идет обращение к таблице маршрутизации. _________________ Знание принципов компенсирует незнание фактов. |
|
Вернуться к началу |
|
|
Jolik
Зарегистрирован: 31.03.2004 Сообщения: 56
|
Добавлено: Пт Фев 17 2006 17:38 Заголовок сообщения: Секундочку... |
|
|
Andy_user писал(а): | Думаю, будет так же.
Работа с сокетами в винде содрана с *nix систем.
Еще раз напомню:
Формирование пакета идет раньше, затем идет обращение к таблице маршрутизации. |
при формировании пакета система должна знать адрес интерфейса, по которому будет отправлять - иначе и получается такая лабуда если я отправляю пакет по указанному адресу, ведь он нормальный обратный ИП адрес подставит, т.е. глянет в табличу марш., посмотрит по какому интерфейсу пулять, подцепит обратный адрес этого интерфейса и все будет чики -пики. (кстати - надо бы проверить! может таже лабуда). А с бродкастом видимо проблема в том, что бродкастузлу 255.255.255.255 удовлетворяют два пути (кстати, почему бы сразу в два не пульнуть - это же бродкаст). |
|
Вернуться к началу |
|
|
Andy_user
Зарегистрирован: 03.12.2003 Сообщения: 382 Откуда: Санкт-Петербург
|
Добавлено: Пт Фев 17 2006 17:47 Заголовок сообщения: |
|
|
Цитата: | при формировании пакета система должна знать адрес интерфейса, по которому будет отправлять - иначе и получается такая лабуда |
Пакет формирует не система, а прикладная программа.
И знать, какой адрес нужно подставить в качестве адреса отправителя, должна она же.
И получит список IP-адресов (IP-интерфейсов), чтобы знать с каким из них связать сокет (bind) тоже должна программа. _________________ Знание принципов компенсирует незнание фактов. |
|
Вернуться к началу |
|
|
C37
Зарегистрирован: 09.03.2005 Сообщения: 311
|
Добавлено: Пт Фев 17 2006 19:09 Заголовок сообщения: |
|
|
Что-то мне сдается, что broadcast должен быть не 255.255.255.255, а 192.168.238.255 и 192.168.0.255 соответственно для двух интерфейсов |
|
Вернуться к началу |
|
|
Jolik
Зарегистрирован: 31.03.2004 Сообщения: 56
|
Добавлено: Вт Фев 21 2006 18:50 Заголовок сообщения: Если кому еще топик интересен... |
|
|
Удалось решить только так:
1. получаю список IP адресов через GetIpAddrTable
2. меняю последний байт адреса на 255
3. посылаю через sendto
теперь через route проходит корректно - короче работает!
может кто знает как красивше сделать? |
|
Вернуться к началу |
|
|
C37
Зарегистрирован: 09.03.2005 Сообщения: 311
|
Добавлено: Ср Фев 22 2006 19:18 Заголовок сообщения: |
|
|
Настроить сеть по-человечески, т.е. дать правильный адрес broadcast дла каждой подсети. Тогда не придется программно исправлять ошибку общей настройки при отправке каждого пакета. |
|
Вернуться к началу |
|
|
|