Russian Qt Forum
Ноябрь 27, 2024, 07:07 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QUdpSocket,QTcpSocket NAT  (Прочитано 5700 раз)
kip_one
Гость
« : Февраль 19, 2013, 18:38 »

 Всем добрый день. Я уже не первый день ломаю голову над тем как реализовать идею такого типа:

В наличии есть одна  сервер-программа и некое количество клиентов(1,5,10...).
Клиенты подключаются на сервер(по QTcpSocket and QUdpSocket). Когда другая клиентская программа подключается , сервер высылает ему сообщение кто в сети(QTcpSocket,QTcpServer).Когда клиент меняет статус - его статус меняется у всех его друзей(других клиентов в сети).
До этого этапа все работает Улыбающийся
В случае когда клиент хочет отправить сообщение другому клиенту, он посылает на сервер запрос на который сервер присылает ему ip,port(qudpsocket) нужного ему клиента. Так вот когда я отправляю сообщение по данному адресу - элементарно не приходит.
Если же самому задать порт для QUdpSocket   и открыть порт на роутере - то все приходит.
Можно ли все это провернуть без участия роутера. Хотелось бы передавать напрямую пакеты. Читал по STUN, но что-то не пошло.
Буду рад любой помощи Улыбающийся
« Последнее редактирование: Февраль 19, 2013, 18:51 от kip_one » Записан
alexis031182
Гость
« Ответ #1 : Февраль 19, 2013, 23:31 »

В одной игрушке (Warzone 2100) как-то в исходниках наткнулся на реализацию UPnP. Оно там правда по TCP связь налажена, но скорее всего UDP тоже можно прицепить. Схема сетевого взаимодействия в игре похожа на то, что Вы описали. Есть сервер (лобби) и куча клиентов (в т.ч. и за NAT), каждый из которых, в свою очередь может стать сервером для других на время побоища.
Записан
kip_one
Гость
« Ответ #2 : Февраль 20, 2013, 00:05 »

Если я правильно понимаю, то стать сервером за NAT без настройки на роутере не получится. Мне не обязательно использовать QUdpSocket, но с ним мне кажется дела пойдут легче.
А вообще я уже начинаю думать что это просто плохая идея передавать на прямую. Вместо этого можно использовать сервер через который будет проходить весь обмен пакетами. Это на порядок легче.
Будут какие-то советы по этому поводу?
Записан
alexis031182
Гость
« Ответ #3 : Февраль 20, 2013, 00:53 »

Так вот как раз UPnP и используется, чтобы клиентам свои роутеры не приходилось "трогать". Там, в игре лобби просто содержит список тех компов, что изволили хостить бои (это могут быть обычные машины, сидящие за NAT). Другие клиенты подключаются к лобби и получают список этих активных хостеров. Выбирают себе приглянувшегося, и подключаются к хостящему без каких-либо неудобоваримых телодвижений со стороны последнего.

Так что то, что Вы задумали сделать в своём проекте вполне реализуемо, просто надо плотнее изучить тему. Что касаемо примера реализации, то вышеназванная игрушка уже содержит в своём коде соответствующие строки. Загляните туда. Open Source. Кажется, файл "network.cpp", если мне не изменяет память.
Записан
alexis031182
Гость
« Ответ #4 : Февраль 20, 2013, 00:57 »

...
А вообще я уже начинаю думать что это просто плохая идея передавать на прямую. Вместо этого можно использовать сервер через который будет проходить весь обмен пакетами. Это на порядок легче.
Будут какие-то советы по этому поводу?
Вообще, из задачи надо исходить. Часто, централизация действительно необходима. Но если предполагается, например, чат тет-а-тет, то увеличение трафика, по идее, особо и ни к чему.
Записан
kip_one
Гость
« Ответ #5 : Февраль 20, 2013, 19:59 »

После того как приведу код в порядок думаю попробовать передавать клиент-сервер-клиент аудио и видео поток.
Как вы думаете сколько таких клиентов сможет обслуживать такой сервер?   
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Февраль 20, 2013, 20:07 »

Как вы думаете сколько таких клиентов сможет обслуживать такой сервер?   
В большей степени это будет зависеть от "толщины" канала к серверу. Сервер будет по сути просто проксировать потоки.
Записан
alexis031182
Гость
« Ответ #7 : Февраль 20, 2013, 22:10 »

Вот интересно, по какому принципу работают всякие хамачи. Тоже какие-нибудь используются методы соединения через NAT или совсем иное?
Записан
Bepec
Гость
« Ответ #8 : Февраль 20, 2013, 22:12 »

Хамачи же вроде через сервер работает?
Записан
alexis031182
Гость
« Ответ #9 : Февраль 20, 2013, 23:00 »

Хамачи же вроде через сервер работает?
Да? Я думал там через сервер только данные для организации соединения передаются, а непосредственно само сетевое соединение устанавливается между клиентами напрямую.
Записан
Bepec
Гость
« Ответ #10 : Февраль 20, 2013, 23:23 »

Незнай. Насколько я помню, гамали давным давно в age of empires через него. И как только он не мог связаться со своим сервером, всё падало.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.052 секунд. Запросов: 23.