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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: [solved]udp связь для многих клиентов в одном приложении  (Прочитано 3908 раз)
pethead
Гость
« : Ноябрь 02, 2010, 04:45 »

вообще меня интресует можно на qt udp сделать так:
отсылаем на сервер датаграмму на заданный фикс. порт. далее нужно принять ответ, но приемный порт по идее должен задаваться в исх. датаграмме, но система задает его сама и что ставить в бинд я не знаю.
на чистом Си я такое реализовал через sendto,select,recvfrom. задаю только исх. порт. ответ ловится.

для чего это нужно : когда к серверу лезут несколько клиентов на один порт, а ответы он отдает на разные порты принятые в датаграмме.

как сделать такое на qt?

с помощью connecttohost? примерчик бы
« Последнее редактирование: Ноябрь 02, 2010, 13:37 от pethead » Записан
pethead
Гость
« Ответ #1 : Ноябрь 02, 2010, 10:30 »

ну вообщем я сделал что датаграмма уходит серверу на Destination Port (фиксированный), а тот отвечает на Source Port (который в датаграмме задается сокетной подсистемой, что видно в сниффере)

ingredients:

m_pUdpSocket = new QUdpSocket(this);
m_pUdpSocket->connectToHost(strHost, nPort);

используем write:

QByteArray arrBlock;
QDataStream out(&arrBlock, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_7);
out << (quint8)0x4C << (quint8)0x4D << (quint8)0x43 << (quint8)0x50 << (quint8)0x00 << (quint8)0x01 << (quint8)0xAA << (quint8)0xBB << (quint8)0x01 << (quint8)0x00 << (quint8)0x00;
m_pUdpSocket->write(arrBlock);

и slotReadyRead кторый срабатывает по m_pUdpSocket, SIGNAL(readyRead())

Улыбающийся

отсылку\прием наблюдаю через WireShark сниффер (сначала засовывал в буфер данные без (quint8) тогда уходили по 4 байта на каждый отправленный байт, на что мой сервер молчал Улыбающийся не понимал команду, а через приведение (quint8) сразу ушел байтовый поток на кторый сервер ответил что и было зафиксировано сигналом ReadyRead)
« Последнее редактирование: Ноябрь 02, 2010, 13:15 от pethead » Записан
pethead
Гость
« Ответ #2 : Ноябрь 02, 2010, 13:08 »

так... теперь проблема в приеме ответа.
точнее ответ приходит, длина m_pUdpSocket->bytesAvailable() правильная, но вынуть байтовую последовательность что то не получается.
нули какие то... хотя в сниффере четко видно что ответ от сервера правильный с нужными байтами. сервер никакого отношения у qt не имеет, это железка. Улыбающийся так что не получится написать общение через через qt сокет с не-qt сокетом что ли? в примерах везде и клиент и сервер это qt сокеты.

в момент изъятия байта из потока вылазит
Код:
		quint8 j;
for (int i=1;i<=size;i++){
in >> j;
}

QSocketNotifier: Invalid socket specified
QSocketNotifier: Internal error

что не так?

*ступил! в мануале написано использовать read()
переделал на

QByteArray ba;
ba=m_pUdpSocket->read(size);

теперь работает как мне надо!
« Последнее редактирование: Ноябрь 02, 2010, 13:35 от pethead » Записан
registrationfedser87
Гость
« Ответ #3 : Ноябрь 02, 2010, 13:32 »

Проверь без QDataStream-напрямую:
Код
C++ (Qt)
while (udpSocket->hasPendingDatagrams()) {
        QByteArray datagram;
        datagram.resize(udpSocket->pendingDatagramSize());
        QHostAddress sender;
        quint16 senderPort;
 
        udpSocket->readDatagram(datagram.data(), datagram.size(),
                                &sender, &senderPort);
 
        processTheDatagram(datagram);
    }
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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