da fällt mir noch was ein :
wenn er beim senden durch die waitfor...-geschichte durch ist, bleibt er da in der run()-methode oder wird diese verlassen (womit ja die socket-verbindung abgebaut würde) ?
Obel
QPixmap über QDataStream schicken
hoi,
alles weglassen geht net, halt das am client geht net, weil er sonst irgendwann versucht etwas aus dem strea zu lesen wenn der server vlt noch gar nichts geschickt hat, und wenn ich das waitForReadyRead lass und beim server dann das mit usleep versuch greif das waitForReadyRead net und der verbindungsversuch scheitert.
wenn i flush und waitfor am server allein weglass gehts auch wieder nur teilweiße, kommt ma vor das es dann seltener funktioniert
hm komisch is das er manchmal 4380 oder 7300 oder 11060 Bytes zum lesen hat und manchaml 12938 wo ers dann speichern kann, so eine scheiße xD null plan warum der pc das so macht, ..... hmmm
lg kochi
alles weglassen geht net, halt das am client geht net, weil er sonst irgendwann versucht etwas aus dem strea zu lesen wenn der server vlt noch gar nichts geschickt hat, und wenn ich das waitForReadyRead lass und beim server dann das mit usleep versuch greif das waitForReadyRead net und der verbindungsversuch scheitert.
wenn i flush und waitfor am server allein weglass gehts auch wieder nur teilweiße, kommt ma vor das es dann seltener funktioniert
hm komisch is das er manchmal 4380 oder 7300 oder 11060 Bytes zum lesen hat und manchaml 12938 wo ers dann speichern kann, so eine scheiße xD null plan warum der pc das so macht, ..... hmmm
lg kochi
nun gut, das paßt zumindest in mein 'weltbild'wenn i flush und waitfor am server allein weglass gehts auch wieder nur teilweiße, kommt ma vor das es dann seltener funktioniert
und wie sieht es nun nach dem senden aus ... programmtechnisch ? denn wenn du dann die run()-methode verläßt, könnte ich mir vorstellen daß das folgende auswirkung hat :
die daten sind jetzt dem IODevice komplett übergeben worden. da dies bei dir nen tcpsocket ist, ist dies ein gepuffertes device. das heißt, das die daten noch längst nicht übers kabel sind. beim verlassen von run() wird jedoch der socket ungültig. da ist es also mehr oder weniger zufall wie viel der gepufferten daten bereits übertragen sind, wenn der socket gelöscht wird.
zum test würd ich das verlassen von run() mittels usleep() mal ne sekunde verzögern. da brauchst du dann aber wieder ein flush() vorher (falls du das alte rausgenommen hast).
wenn es dann klappt, mußt du deinen sende-thread umbauen, sodaß der socket nicht zerstört wird (dann ist das flush() auch nicht mehr nötig). die sleep-variant ist nur als test gedacht.
Obel
gut ^^
ähm also der socket wird am ende von run() wieder abgeborchen
also finde auch dass deine theorie sehr logisch klingt, habs versucht aber leider ändert sich nichts, nur hin und wieder erfolg beim übertragen
Dachte dass der thread beim waitfor wartet bis alles drausen ist aba in der doku steht auch das es nur im iodevice ist und nicht übers kabel,
hier mal meine run()
vlt liegts auch am client
schade dachte jetzt haben wirs ^^, aba der will das bild net gscheid senden, im notfall lass ich den client so oft das bild anfragen mit ner schleife bis ers speichern kann
lg kochi
ähm also der socket wird am ende von run() wieder abgeborchen
Code: Alles auswählen
proband.disconnectFromHost();
proband.waitForDisconnected(TIMEOUT);Dachte dass der thread beim waitfor wartet bis alles drausen ist aba in der doku steht auch das es nur im iodevice ist und nicht übers kabel,
hier mal meine run()
Code: Alles auswählen
void Worker::run() {
// Socket aus Socket-Deskriptor ableiten und Textstream aufsetzen
QTcpSocket proband;
proband.setSocketDescriptor(socketDesc);
QDataStream stream(&proband);
// IP-Adresse und Port merken
ipAddr = QString("%1:%2")
.arg(proband.peerAddress().toString())
.arg(proband.peerPort());
QPixmap image("Logo.PNG");
cout << "Breite: " << image.width() << " Höhe: " << image.height() << endl;
cout << "1: QTcpSocket Size: " << proband.size() << " Bytes am Socket: " << proband.bytesAvailable() << endl;
stream << image;
cout << "2: QTcpSocket Size: " << proband.size() << " Bytes am Socket: " << proband.bytesAvailable() << endl;
cout << "3: QTcpSocket Size: " << proband.size() << " Bytes am Socket: " << proband.bytesAvailable() << endl;
cout << proband.bytesToWrite() << endl;
if (!proband.waitForBytesWritten(TIMEOUT)) {
//fehlerBehandeln(pServer->error());
return;
}
cout << proband.bytesToWrite() << endl;
cout << "TCPFlush: " << proband.flush() << endl;
cout << proband.bytesToWrite() << endl;
usleep(1000);
// Verbindung trennen
proband.disconnectFromHost();
proband.waitForDisconnected(TIMEOUT);
}Code: Alles auswählen
void DerConnect::verbinde() {
// Eventuell bestehende Verbindung abbrechen, neue Verbindung herstellen
pServer->abort();
pServer->connectToHost(server->text(), port->text().toInt());
if (!pServer->waitForConnected(SERVER_TIMEOUT)) {
//fehlerBehandeln(pServer->error());
cout << "misslungen" << endl;
return;
}
QDataStream stream(pServer);
cout << "1: QTcpSocket Size: " << pServer->size() << " Bytes am Socket: " << pServer->bytesAvailable() << endl;
if (!pServer->waitForReadyRead(SERVER_TIMEOUT)) {
//fehlerBehandeln(pServer->error());
return;
}
QPixmap image;
cout << "2: QTcpSocket Size: " << pServer->size() << " Bytes am Socket: " << pServer->bytesAvailable() << endl;
stream >> image;
cout << "3: QTcpSocket Size: " << pServer->size() << " Bytes am Socket: " << pServer->bytesAvailable() << endl;
cout << "Breite: " << image.width() << " Höhe: " << image.height() << endl;
cout << stream.atEnd() <<" <-- Fertig? speicher Test: " << image.save("here.png", "png") << endl;
}lg kochi
Code: Alles auswählen
cout << proband.bytesToWrite() << endl;
usleep(1000); Obel