[Qt4] Udp socket data extract

Pagina: 1
Acties:

Onderwerpen


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
Hallo iedereen,

Ik ben bezig met een spel te maken over het netwerk. Ik stuur de commando's door via tcp. Nu heb ik gemerkt dat ik dit beter via udp doe omdat bij grotere hoeveelheden data de client zeer traag wordt omdat hij alle data MOET ontvangen in tegenstelling tot udp. Nu zit ik vast met het volgende. Ik zet mijn variabelen in een Qdatastream en zet deze dan in een Qbytearray. Dit blijft hetzelfde bij tcp en udp. Het verschil zit echter in het ontvangen. Ik vind niet hoe ik de data terug in een datastream kan steken bij als ik de data ontvang langs de kant van de ontvanger.

Bij tcp deed ik dit als volgende:

code:
1
2
3
QDataStream out(&data, QIODevice::ReadWrite);
out << QString("cor") << quint8(curX) << quint8(curY);
send_data(data);


ontvanger tcp

code:
1
2
QDataStream in(tcp_socket);
in >> id_action >> number >> number1;


Dit werkte allemaal perfect.

Dit doe ik om data te verzenden bij udp. Datastream heb ik in bytearray gestoken.
code:
1
2
3
udpsocket->writeDatagram(datagram.data(), datagram.size(),
                                QHostAddress::Broadcast, 45454);
       qDebug()<<"udp data verzonden";


Nu weet ik echter niet hoe ik de data terug moet extraheren.
code:
1
2
3
4
while (udpSocket->hasPendingDatagrams()) {
             QByteArray datagram;
             datagram.resize(udpSocket->pendingDatagramSize());
             udpSocket->readDatagram(datagram.data(), datagram.size());


Mijn data zit nu in datagram.data(). Nu vraag ik me af hoe ik de datastream er uit kan halen.
QDataStream in(udpsocket) werkt niet. Omdat de data moet gelezen worden en op deze manier wordt het blijkbaar niet gelezen. Kan iemand me helpen?

Alvast bedankt

Acties:
  • 0 Henk 'm!

  • Robbiedobbie
  • Registratie: Augustus 2009
  • Laatst online: 16-09 19:30
Ik heb geen ervaring met Qt, maar volgens mij zou je gebruik kunnen maken van memcpy().
Zo zou je bijvoorbeeld id_action terug kunnen halen:
C++:
1
memcopy(id_action, datagram.data(), sizeof(id_action));


Dit heb ik maar snel eventjes getypt, dus correct me if I'm wrong ;)

Acties:
  • 0 Henk 'm!

  • farlane
  • Registratie: Maart 2000
  • Laatst online: 16-09 22:43
QDataStream op basis van een buffer?

Vanaf daar is het verhaal hetzelfde als je TCP code. Alternatief is om zelf de data te parsen vanuit de buffer.

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.


Acties:
  • 0 Henk 'm!

Verwijderd

Topicstarter
farlane schreef op zaterdag 12 mei 2012 @ 19:09:
QDataStream op basis van een buffer?

Vanaf daar is het verhaal hetzelfde als je TCP code. Alternatief is om zelf de data te parsen vanuit de buffer.
Hier ben ik verder inderdaad al verder mee geraakt. Bedankt voor de tip!