Seite 1 von 1

Dateien versenden mit UdpSocket

Verfasst: 4. März 2007 00:47
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?

Verfasst: 4. März 2007 11:11
von upsala
Genauso und nicht anders...

Verfasst: 4. März 2007 12:08
von gerd87
Kannst du mir auch sagen, wie man das bild in ein QByteArray konvertiert?

Verfasst: 4. März 2007 12:29
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

Verfasst: 5. März 2007 03:05
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.

Verfasst: 5. März 2007 12:27
von upsala
Was kommt an? Sind empfangene und gesendete Daten gleich groß? Haben sich einzelne Bytes verändert?

Verfasst: 5. März 2007 17:50
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.

Verfasst: 5. März 2007 18:00
von upsala
Welchen Fehler liefert der Sender? Wie groß sind die Pakete, die nicht übertragen werden?

Verfasst: 5. März 2007 21:40
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?

Verfasst: 5. März 2007 22:02
von upsala
Läßt du dir überhaupt einen Fehler ausgeben? Hast du überhaupt die Dokumentation zu QUdpSocket gelesen? Weist du überhaupt was UDP ist?

Verfasst: 5. März 2007 23:42
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.

Verfasst: 6. März 2007 17:04
von upsala
Was spricht eigentlich gegen TCP?

Verfasst: 6. März 2007 21:37
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?

Verfasst: 7. März 2007 09:11
von upsala
Du müßtest dich zumindest nicht mit verlorenen und zu großen Paketen rumschlagen.