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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Широковещательные сообщения.  (Прочитано 16758 раз)
SubaroMows
Гость
« : Сентябрь 25, 2011, 19:18 »

у нас есть сервер.
у нас есть клиент.
клиент не знает где сервер.
клиент посылает широковещательное сообщение.

У меня несколько вопросов:
Что такое широковещательное сообщение?
И что значит клиент не знает где сервер?
Что такое датаграммы?

Я пытался разобраться, и все пути меня ведут к QUdpsocket.
Но вот какая штука, мы же там указываем на какой порт слать сообщение, и сервер знает этот порт.
Мы просто шлём сообщение на конкретный порт, никакого тут широковещания не вижу( Под широковещанием я понимаю, что отправка идёт всем пользователям сети). А если сервак не знает на какой порт придёт сообщение, или наоборот, клиент не знает с какого порта сервак считывает.

Буду очень благодарен, если просветите.
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #1 : Сентябрь 25, 2011, 20:16 »

Мы просто шлём сообщение на конкретный порт, никакого тут широковещания не вижу( Под широковещанием я понимаю, что отправка идёт всем пользователям сети).
http://ru.wikipedia.org/wiki/Broadcasting
Широковещание тут в том, что вы отправляете данные на 192.168.0.255:1042 и данные уходят на все адреса сети: 192.168.0.1:1042, 192.168.0.2:1042 ... 192.168.0.254:1042
Вот что такое широковещание. А пытаться стучаться по всем портам конкретного ip адреса - это не широковещание, а сканирование портов. Закончиться это может тем, что фаерволл сканируемого просто забанит вас за попытку атаки на компьютер.

Записан
Hronom
Гость
« Ответ #2 : Сентябрь 25, 2011, 20:20 »

Клиенты слушают определённый порт, сервер должен знать какой порт слушают клиенты. После чего на сервере шлёте клиентам дейтаграмму при помощи QUdpSocket::writeDatagram где указываете порт который слушают клиенты, а в качестве адреса выбираете QHostAddress::Broadcast это широковещательный адрес, то есть отсылается всем клиентам в сети на указанный порт. Все клиенты должны слушать один и тот же порт. Что такое дейтаграмма посмотрите на википедии там в принципе понятно.
Записан
SubaroMows
Гость
« Ответ #3 : Сентябрь 25, 2011, 20:52 »

Спасибо LisandreL, Hronom.
Записан
SubaroMows
Гость
« Ответ #4 : Сентябрь 26, 2011, 16:31 »

Тут же задам вопрос:
А можно к порту, обращаться как файлу?
Записан
Hronom
Гость
« Ответ #5 : Сентябрь 26, 2011, 20:27 »

эээ странный вопрос... порт может слушать QUdpSocket обращаться к нему не надо. Просто с сокета считываете дейтаграмму которая пришла. При приходе дейтаграммы сокет издаёт сигнал. После чего считываем дейтаграмму.
Записан
SubaroMows
Гость
« Ответ #6 : Сентябрь 27, 2011, 18:28 »

Ну я имел ввиду, чтобы к нему можно было обращаться типа localhost\..\socket1.

ещё задам вопрос глупый-)
У меня есть клиенты которые не знают на какой машине сервер.
Они шлют широковещательный запрос на порт XXX.
Затем нужно что бы сервер ответил и установил с каждым клиентом связь tcp.
Вот тут у меня проблема: для каждого клиента нужен свой порт для свзяи по tcp.
А чтобы клиент узнал порт, сервер должен сообщить ему. Но как он сообщит если порт то не известен...
Или это не правильная архитектура клиент - серверного приложения?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #7 : Сентябрь 27, 2011, 18:46 »

для каждого клиента нужен свой порт для свзяи по tcp
Зачем каждому свой порт?

Или это не правильная архитектура клиент - серверного приложения?
Более классический способ всё же чтобы клиент подключался к серверу.
1) Широковещательный UDP запрос «где ты сервер?» на заранее известный порт.
2) Сервер узнаёт из этого запроса адрес клиента и посылает на него UDP-ответ сервера «я тут» клиенту на заранее известный (или на переданный в запросе) порт.
3) Клиент получает из ответа адрес сервера и устанавливает TCP-соединение на заранее известный (или на переданный в ответе) порт.
Записан
SubaroMows
Гость
« Ответ #8 : Сентябрь 27, 2011, 19:16 »

Спасибо так и сделаю.

Зачем каждому свой порт?
void    connectToHost ( const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite )

Или можно устанавливать связи через один порт, нескольким клиентам?
Если да, то для того чтобы сервер распознавал от кого пришло сообщение нужно для каждого клиента ключ.
И когда клиент посылает сообщение, он указывает свой ключ, типа это от меня а не от кого то другого?
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #9 : Сентябрь 27, 2011, 19:33 »

Или можно устанавливать связи через один порт, нескольким клиентам?
Если да, то для того чтобы сервер распознавал от кого пришло сообщение нужно для каждого клиента ключ.
Можно, ключа не надо.
TCP-cокет определяется адресом сервера, адресом клиента, портом сервера и портом клиента. Порт сервера вы задаёте при коннекте, порт клиента же выдаёт ОС.
Возьмём 2 сокета, если клиенты на разных машинах, то будут разные ip-адреса в сокетах, а если на одной машине, то будут гарантированно разные порты клиентов.
Таким образом компьютер может понять от кого пришёл пакет и напрвить его в нужный сокет.
Записан
SubaroMows
Гость
« Ответ #10 : Сентябрь 27, 2011, 20:32 »

Я запутался.
У нас есть сервер который создаётся и работает примерное так:
Код:
QTcpServer *tcpServer;
tcpServer = new QTcpServer(this);
if(!tcpServer->listen(HostXXX,45454))
      "Error connection"
    else
        "ОК"   
И есть клиент который конектится примерно так
Код:
QTcpSocket *tcpSocket;
tcpSocket->connectToHost(HostXXX, 45454);

Почему у клиентов с одного компа порты разные? И в каком месте ОС выдаёт порт клиенту
Я проверил таким образом
Код:
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
QMessageBox::information(this,"s",tr("%1").arg(clientConnection->localPort()));

Мне сообщение выдало 45454, т.е у клиента такой же порт
Записан
LisandreL
Птица говорун
*****
Offline Offline

Сообщений: 984


Надо улыбаться


Просмотр профиля
« Ответ #11 : Сентябрь 27, 2011, 20:42 »

Код:
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
QMessageBox::information(this,"s",tr("%1 %2").arg(clientConnection->localPort()).arg(clientConnection->peerPort()));
На стороне сервера:
localPort - порт, который слушает сервер;
peerPort - порт, который был выдан клиенту.
« Последнее редактирование: Сентябрь 27, 2011, 20:45 от LisandreL » Записан
SubaroMows
Гость
« Ответ #12 : Сентябрь 27, 2011, 20:51 »

Вау, действительно-)
интересно даже, он выдаёт порты клиенту, прибавляя единицу-))

Спасибо ещё раз большое LisandreL.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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