Название: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 25, 2011, 19:18 у нас есть сервер.
у нас есть клиент. клиент не знает где сервер. клиент посылает широковещательное сообщение. У меня несколько вопросов: Что такое широковещательное сообщение? И что значит клиент не знает где сервер? Что такое датаграммы? Я пытался разобраться, и все пути меня ведут к QUdpsocket. Но вот какая штука, мы же там указываем на какой порт слать сообщение, и сервер знает этот порт. Мы просто шлём сообщение на конкретный порт, никакого тут широковещания не вижу( Под широковещанием я понимаю, что отправка идёт всем пользователям сети). А если сервак не знает на какой порт придёт сообщение, или наоборот, клиент не знает с какого порта сервак считывает. Буду очень благодарен, если просветите. Название: Re: Широковещательные сообщения. Отправлено: LisandreL от Сентябрь 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 адреса - это не широковещание, а сканирование портов. Закончиться это может тем, что фаерволл сканируемого просто забанит вас за попытку атаки на компьютер. Название: Re: Широковещательные сообщения. Отправлено: Hronom от Сентябрь 25, 2011, 20:20 Клиенты слушают определённый порт, сервер должен знать какой порт слушают клиенты. После чего на сервере шлёте клиентам дейтаграмму при помощи QUdpSocket::writeDatagram где указываете порт который слушают клиенты, а в качестве адреса выбираете QHostAddress::Broadcast это широковещательный адрес, то есть отсылается всем клиентам в сети на указанный порт. Все клиенты должны слушать один и тот же порт. Что такое дейтаграмма посмотрите на википедии там в принципе понятно.
Название: Re: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 25, 2011, 20:52 Спасибо LisandreL, Hronom.
Название: Re: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 26, 2011, 16:31 Тут же задам вопрос:
А можно к порту, обращаться как файлу? Название: Re: Широковещательные сообщения. Отправлено: Hronom от Сентябрь 26, 2011, 20:27 эээ странный вопрос... порт может слушать QUdpSocket обращаться к нему не надо. Просто с сокета считываете дейтаграмму которая пришла. При приходе дейтаграммы сокет издаёт сигнал. После чего считываем дейтаграмму.
Название: Re: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 27, 2011, 18:28 Ну я имел ввиду, чтобы к нему можно было обращаться типа localhost\..\socket1.
ещё задам вопрос глупый-) У меня есть клиенты которые не знают на какой машине сервер. Они шлют широковещательный запрос на порт XXX. Затем нужно что бы сервер ответил и установил с каждым клиентом связь tcp. Вот тут у меня проблема: для каждого клиента нужен свой порт для свзяи по tcp. А чтобы клиент узнал порт, сервер должен сообщить ему. Но как он сообщит если порт то не известен... Или это не правильная архитектура клиент - серверного приложения? Название: Re: Широковещательные сообщения. Отправлено: LisandreL от Сентябрь 27, 2011, 18:46 для каждого клиента нужен свой порт для свзяи по tcp Зачем каждому свой порт?Или это не правильная архитектура клиент - серверного приложения? Более классический способ всё же чтобы клиент подключался к серверу.1) Широковещательный UDP запрос «где ты сервер?» на заранее известный порт. 2) Сервер узнаёт из этого запроса адрес клиента и посылает на него UDP-ответ сервера «я тут» клиенту на заранее известный (или на переданный в запросе) порт. 3) Клиент получает из ответа адрес сервера и устанавливает TCP-соединение на заранее известный (или на переданный в ответе) порт. Название: Re: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 27, 2011, 19:16 Спасибо так и сделаю.
Зачем каждому свой порт? void connectToHost ( const QHostAddress & address, quint16 port, OpenMode openMode = ReadWrite ) Или можно устанавливать связи через один порт, нескольким клиентам? Если да, то для того чтобы сервер распознавал от кого пришло сообщение нужно для каждого клиента ключ. И когда клиент посылает сообщение, он указывает свой ключ, типа это от меня а не от кого то другого? Название: Re: Широковещательные сообщения. Отправлено: LisandreL от Сентябрь 27, 2011, 19:33 Или можно устанавливать связи через один порт, нескольким клиентам? Можно, ключа не надо.Если да, то для того чтобы сервер распознавал от кого пришло сообщение нужно для каждого клиента ключ. TCP-cокет определяется адресом сервера, адресом клиента, портом сервера и портом клиента. Порт сервера вы задаёте при коннекте, порт клиента же выдаёт ОС. Возьмём 2 сокета, если клиенты на разных машинах, то будут разные ip-адреса в сокетах, а если на одной машине, то будут гарантированно разные порты клиентов. Таким образом компьютер может понять от кого пришёл пакет и напрвить его в нужный сокет. Название: Re: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 27, 2011, 20:32 Я запутался.
У нас есть сервер который создаётся и работает примерное так: Код: QTcpServer *tcpServer; Код: QTcpSocket *tcpSocket; Почему у клиентов с одного компа порты разные? И в каком месте ОС выдаёт порт клиенту Я проверил таким образом Код: QTcpSocket *clientConnection = tcpServer->nextPendingConnection(); Мне сообщение выдало 45454, т.е у клиента такой же порт Название: Re: Широковещательные сообщения. Отправлено: LisandreL от Сентябрь 27, 2011, 20:42 Код: QTcpSocket *clientConnection = tcpServer->nextPendingConnection(); localPort - порт, который слушает сервер; peerPort - порт, который был выдан клиенту. Название: Re: Широковещательные сообщения. Отправлено: SubaroMows от Сентябрь 27, 2011, 20:51 Вау, действительно-)
интересно даже, он выдаёт порты клиенту, прибавляя единицу-)) Спасибо ещё раз большое LisandreL. |