Russian Qt Forum

Qt => Работа с сетью => Тема начата: kip_one от Февраль 19, 2013, 18:38



Название: QUdpSocket,QTcpSocket NAT
Отправлено: kip_one от Февраль 19, 2013, 18:38
 Всем добрый день. Я уже не первый день ломаю голову над тем как реализовать идею такого типа:

В наличии есть одна  сервер-программа и некое количество клиентов(1,5,10...).
Клиенты подключаются на сервер(по QTcpSocket and QUdpSocket). Когда другая клиентская программа подключается , сервер высылает ему сообщение кто в сети(QTcpSocket,QTcpServer).Когда клиент меняет статус - его статус меняется у всех его друзей(других клиентов в сети).
До этого этапа все работает :)
В случае когда клиент хочет отправить сообщение другому клиенту, он посылает на сервер запрос на который сервер присылает ему ip,port(qudpsocket) нужного ему клиента. Так вот когда я отправляю сообщение по данному адресу - элементарно не приходит.
Если же самому задать порт для QUdpSocket   и открыть порт на роутере - то все приходит.
Можно ли все это провернуть без участия роутера. Хотелось бы передавать напрямую пакеты. Читал по STUN, но что-то не пошло.
Буду рад любой помощи :)


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: alexis031182 от Февраль 19, 2013, 23:31
В одной игрушке (Warzone 2100) как-то в исходниках наткнулся на реализацию UPnP. Оно там правда по TCP связь налажена, но скорее всего UDP тоже можно прицепить. Схема сетевого взаимодействия в игре похожа на то, что Вы описали. Есть сервер (лобби) и куча клиентов (в т.ч. и за NAT), каждый из которых, в свою очередь может стать сервером для других на время побоища.


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: kip_one от Февраль 20, 2013, 00:05
Если я правильно понимаю, то стать сервером за NAT без настройки на роутере не получится. Мне не обязательно использовать QUdpSocket, но с ним мне кажется дела пойдут легче.
А вообще я уже начинаю думать что это просто плохая идея передавать на прямую. Вместо этого можно использовать сервер через который будет проходить весь обмен пакетами. Это на порядок легче.
Будут какие-то советы по этому поводу?


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: alexis031182 от Февраль 20, 2013, 00:53
Так вот как раз UPnP и используется, чтобы клиентам свои роутеры не приходилось "трогать". Там, в игре лобби просто содержит список тех компов, что изволили хостить бои (это могут быть обычные машины, сидящие за NAT). Другие клиенты подключаются к лобби и получают список этих активных хостеров. Выбирают себе приглянувшегося, и подключаются к хостящему без каких-либо неудобоваримых телодвижений со стороны последнего.

Так что то, что Вы задумали сделать в своём проекте вполне реализуемо, просто надо плотнее изучить тему. Что касаемо примера реализации, то вышеназванная игрушка уже содержит в своём коде соответствующие строки. Загляните туда. Open Source. Кажется, файл "network.cpp", если мне не изменяет память.


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: alexis031182 от Февраль 20, 2013, 00:57
...
А вообще я уже начинаю думать что это просто плохая идея передавать на прямую. Вместо этого можно использовать сервер через который будет проходить весь обмен пакетами. Это на порядок легче.
Будут какие-то советы по этому поводу?
Вообще, из задачи надо исходить. Часто, централизация действительно необходима. Но если предполагается, например, чат тет-а-тет, то увеличение трафика, по идее, особо и ни к чему.


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: kip_one от Февраль 20, 2013, 19:59
После того как приведу код в порядок думаю попробовать передавать клиент-сервер-клиент аудио и видео поток.
Как вы думаете сколько таких клиентов сможет обслуживать такой сервер?   


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: Old от Февраль 20, 2013, 20:07
Как вы думаете сколько таких клиентов сможет обслуживать такой сервер?   
В большей степени это будет зависеть от "толщины" канала к серверу. Сервер будет по сути просто проксировать потоки.


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: alexis031182 от Февраль 20, 2013, 22:10
Вот интересно, по какому принципу работают всякие хамачи. Тоже какие-нибудь используются методы соединения через NAT или совсем иное?


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: Bepec от Февраль 20, 2013, 22:12
Хамачи же вроде через сервер работает?


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: alexis031182 от Февраль 20, 2013, 23:00
Хамачи же вроде через сервер работает?
Да? Я думал там через сервер только данные для организации соединения передаются, а непосредственно само сетевое соединение устанавливается между клиентами напрямую.


Название: Re: QUdpSocket,QTcpSocket NAT
Отправлено: Bepec от Февраль 20, 2013, 23:23
Незнай. Насколько я помню, гамали давным давно в age of empires через него. И как только он не мог связаться со своим сервером, всё падало.