Dateien versenden mit UdpSocket

Alles rund um die Programmierung mit Qt
Antworten
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Dateien versenden mit UdpSocket

Beitrag von gerd87 »

Hallo,

habe hier im Forum schonmal das Thema gesehen, aber noch nicht die richtige lösung.
Ich möchte mittels QUdpSocket Dateien über das Netzwerk versenden.
Im Moment bin ich soweit, dass ich eine Nachricht vom Client zum Server schicken kann.
Nun muss ich aber eine Datei, z.B. ein Bild versenden.
Muss man das vorher in ein QByteArry umwandeln oder wie kann man das versenden?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Genauso und nicht anders...
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Kannst du mir auch sagen, wie man das bild in ein QByteArray konvertiert?
Christian81
Beiträge: 7319
Registriert: 26. August 2004 14:11
Wohnort: Bremen
Kontaktdaten:

Beitrag von Christian81 »

gerd87 hat geschrieben:Kannst du mir auch sagen, wie man das bild in ein QByteArray konvertiert?
Indem man sich einfach mal mit der Doku befasst anstatt immer nur zu hoffen hier alles vorgekaut zu bekommen!

http://doc.trolltech.com/4.2/qfile-members.html
MfG Christian

'Funktioniert nicht' ist keine Fehlerbeschreibung
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Habe das jetzt soweit:

Senden:

Code: Alles auswählen

    udpSocketClient = new QUdpSocket(this);
    QByteArray datagram;
 

    QFile file("cam.bmp");
    if (!file.open(QIODevice::ReadWrite))
    {
        QMessageBox::information( this, "NetChat - Info", QString("Nix opened"), "&Ok" );
    	return;
    }
    datagram = file.readAll(); 
    udpSocketClient->writeDatagram(datagram.data(), datagram.size(), QHostAddress(lineEditServer->text()), 53000);

Empfangen:

Code: Alles auswählen

  udpSocketServer = new QUdpSocket( this );
  udpSocketServer->bind(53000);

  connect( udpSocketServer, SIGNAL( readyRead() ), this, SLOT( clientReceivedUdp() ) );

void MainForm::clientReceivedUdp( void )
{
  QByteArray receivedText;
  
  receivedText = udpSocketServer->readAll();
   
  QImage image;
  
  image.loadFromData (receivedText);
  
  labelCam->setPixmap(QPixmap::fromImage(image));
}
Komme da aber nicht weiter. Das Funktioniert so nicht.
Es kommt auf jeden Fall etwas an. Jetzt weiss ich aber nicht, ob es falsch gesendet oder beim empfang falsch interpretiert wurde.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was kommt an? Sind empfangene und gesendete Daten gleich groß? Haben sich einzelne Bytes verändert?
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Danke für den Tip.
Habe das bei beiden getestet. Das ergebnis ist so: gesendet wird immer etwas, empfangen wird nicht immer etwas. Wie es jetzt ist, wird nichts empfangen, d.h. die Funktion wird nicht aufgerufen.
Habe mal versucht, ein normalen Text zu versenden, das hat funktioniert.
Aber warum macht er denn ein Unterschied zwischen den beiden?
Bei beiden habe ich das mit QByteArray gesendet.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Welchen Fehler liefert der Sender? Wie groß sind die Pakete, die nicht übertragen werden?
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Es wird kein Fehler ausgegeben.
Wenn ich das QByteArray mit size() auslese, ist es ca. 30000 groß.
Kann es vielleicht daran liegen, dass es zu Groß ist?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Läßt du dir überhaupt einen Fehler ausgeben? Hast du überhaupt die Dokumentation zu QUdpSocket gelesen? Weist du überhaupt was UDP ist?
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Ja, habe jetzt rausgefunden, dass ein Paket nicht größer sein darf, als 65507 Byte. Das Bild war insgesamt ca. vier mal so groß. Mit einem kleineren Bild hat es dann auch funktioniert.
Werde das Bild dann splitten müssen und es in mehreren Paketen rüberschicken müssen.
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Was spricht eigentlich gegen TCP?
gerd87
Beiträge: 41
Registriert: 18. Februar 2007 17:37

Beitrag von gerd87 »

Ich habe vor, alle 40 ms ein Bild zu versenden (Webcam).
Wenn man jetzt mehrere Clients mit mehreren Verbindungen hat, würde die Lietung etwas überlastet. Oder meinst du mit TCP könnte man das besser realisieren?
upsala
Beiträge: 3946
Registriert: 5. Februar 2006 20:52
Wohnort: Landshut
Kontaktdaten:

Beitrag von upsala »

Du müßtest dich zumindest nicht mit verlorenen und zu großen Paketen rumschlagen.
Antworten