Модераторы: feodorv
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> UDP соединине с одного порта 
:(
    Опции темы
chekist
Дата 17.7.2009, 18:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Можно ли организовать UDP соединение с несколькими удаленными хостами, используя один и тот же порт, но разные сокеты.

Идея была такая:

1) выставить опцию SO_REUSEADDR
2) сделать bind на порт
3) вызвать connect с адресом удаленного хоста.

Однако не работает, пакеты от удаленного хоста не доходят до сокета.
У Стивенска поэтому поводу написано довольно мутно:

"If, in the case of a unicast address, there are multiple sockets that match the datagram, which one of the sockets will receive the datagram is implementation dependent".

Когда создаю два сокета с одни портом, но без коннекта, работает как и должно: только один из них получает пакет.
Однако когда оба связаны с удаленным хостом с помощью connect, вроде только один из них должен "match the datagram", но, увы, ни до одного датаграмма не доходит.

Так и должно быть (пишу все под winsock) ?



Это сообщение отредактировал(а) chekist - 18.7.2009, 11:48
PM MAIL   Вверх
SVN74
Дата 17.7.2009, 21:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 740
Регистрация: 5.5.2008
Где: Комсомольск на Дн епре

Репутация: 1
Всего: 18



Я нечто подобное пробовал на практике:
----------------------------------------------------------
Запустил UDP серверок, законектил UDP клиента к нему, а затем начал конектить копии UDP клиентов к полученому "эфимерному"  порту (уже налаженого соединения) , и первый клиент начал работать как сервер, - начал получать все пакеты от всех клиентов.
Таким же способом можно конектиться к любому UDP клиенту, главное, чтобы клиент первоначально создал соединение с сервером и все клиенты в сети должны знать обратный порт и IP клиента.
------
Надеюсь в тему.....


PM MAIL WWW   Вверх
Vsts
Дата 20.7.2009, 14:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 10.1.2007

Репутация: нет
Всего: 1



Вроде как натыкался в MSDN, что в этом случае поведение recv не определено и для разрешения таких ситуаций вводили SO_EXCLUSIVEADDRUSE. 
  А что мешает сделать обертку к сокету,   которая получает ото всех пакеты, и перераспределяет внутри проги как тебе нужно?
PM MAIL   Вверх
chekist
Дата 20.7.2009, 21:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 27
Регистрация: 19.6.2007

Репутация: нет
Всего: 2



Vsts
Цитата

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


Собственно говоря, так и сделал. Просто хочу узнать, скорее уже с познавательной целью, можно ли сделать так, как написано в моем посте.

В MSDN про SO_REUSEADDR написано следующее
Цитата

Since every connection is uniquely identified by the combination of local and remote addresses, there is no problem with having two sockets bound to the same local address as long as the remote addresses are different.


Но непонятно, речь идет о любом протоколе, или только о connection-oriented (TCP).
PM MAIL   Вверх
Vsts
Дата 21.7.2009, 12:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 19
Регистрация: 10.1.2007

Репутация: нет
Всего: 1



Вот, нашел.Это тоже в MSDN написано:
In the case where the first bind sets no options or SO_REUSEADDR, and the second bind performs a SO_REUSEADDR, the second socket has overtaken the port and behavior regarding which socket will receive packets is undetermined. SO_EXCLUSIVEADDRUSE was introduced to address this situation.

PM MAIL   Вверх
kolobok0
Дата 27.7.2009, 15:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 64
Регистрация: 24.12.2008

Репутация: нет
Всего: 2



Цитата(chekist @ 17.7.2009,  18:59)
Можно ли организовать UDP соединение с несколькими удаленными хостами...

в словосочетании UDP есть слово дайтаграмм. Т.е. данный уровень не обеспечивает коннекта. Он обеспечивает ОТПРАВКУ ваших данных и ВСЁ. Придут или не прийдут до адресата - ваши проблемы.

Это минус с сточки зрения достоверности канала.
Это плюс с точки зрения экономии ресурсов (можно на одном сокете обеспечить как приём так и отпревку пакетов ЭННОМУ кол-ву абонентов. Т.е. нечто своего аля TCP над одним сокетом). Более того можно спокойно обеспечить масштабируемость такого решения.

Обычно на стороне сервака(тот кто предоставляет ресурсы) делают прослушку на фиксированном(ых) сокетах. На стороне клиента (тот кто юзает ресурсы сервака) делают бродкаст на известный сокет. В случае отзыва - соединяемся. В случае тишины - повторяем несколько раз и ищем мосты в другие подсети. И т.д. это класика так сказать. Можно делать более интересные схемы - ну тут от задач пляшут.


удачи Вам
(круглый)
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0999 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.