Russian Qt Forum

Qt => Работа с сетью => Тема начата: pethead от Ноябрь 02, 2010, 04:45



Название: [solved]udp связь для многих клиентов в одном приложении
Отправлено: pethead от Ноябрь 02, 2010, 04:45
вообще меня интресует можно на qt udp сделать так:
отсылаем на сервер датаграмму на заданный фикс. порт. далее нужно принять ответ, но приемный порт по идее должен задаваться в исх. датаграмме, но система задает его сама и что ставить в бинд я не знаю.
на чистом Си я такое реализовал через sendto,select,recvfrom. задаю только исх. порт. ответ ловится.

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

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

с помощью connecttohost? примерчик бы


Название: Re: udp связь для многих клиентов в одном приложении
Отправлено: pethead от Ноябрь 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)


Название: Re: [solved]udp связь для многих клиентов в одном приложении
Отправлено: pethead от Ноябрь 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);

теперь работает как мне надо!


Название: Re: [half-solved]udp связь для многих клиентов в одном приложении
Отправлено: registrationfedser87 от Ноябрь 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);
    }