so, jetzt zu meinem problem:
ich versuche (für ein kleines chatprogramm), eine datei per QSocket über das netzwerk zu verschicken. bevor ich lange erkläre wie ichs angestellt habe, hier der code dazu (nur ein kleines testprogramm):
client.cpp:
Code: Alles auswählen
#include "client.h"
cl::cl( QWidget *parent, const char *name)
: QPushButton( tr("Beenden"), parent, name )
{
socket.connectToHost( "localhost", 1492 );
blocksize = 0;
QString fileName = QFileDialog::getOpenFileName();
QFile file( fileName );
if( !file.open( IO_ReadOnly ) )
{
QMessageBox::warning( this, tr( "Client - Error" ), tr( "Datei %1 konnte nicht zum Lesen geöffnet werden!" ).arg( file.name() ) );
return;
}
QByteArray block;
QDataStream out( block, IO_WriteOnly );
out.setVersion( 5 );
out << (Q_UINT16) 0 << file.readAll();
out.device()->at( 0 );
out << (Q_UINT16) ( block.size() - sizeof( Q_UINT16 ) );
socket.writeBlock( block.data(), block.size() );
}Code: Alles auswählen
#include "server.h"
sv::sv( QWidget *parent, const char *name )
: QServerSocket( 1492, 1, parent, name )
{
}
void sv::newConnection( int socketId )
{
ClientSocket *socket = new ClientSocket( this );
socket->setSocket( socketId );
}
ClientSocket::ClientSocket( QObject *parent, const char *name )
: QSocket( parent, name )
{
connect( this, SIGNAL( readyRead() ),
this, SLOT( readClient() ) );
connect( this, SIGNAL( connectionClosed() ),
this, SLOT( deleteLater() ) );
connect( this, SIGNAL( delayedCloseFinished() ),
this, SLOT( deleteLater() ) );
blocksize = 0;
}
void ClientSocket::readClient()
{
QDataStream in( this );
in.setVersion( 5 );
if( blocksize == 0 )
{
if( bytesAvailable() < sizeof( Q_UINT16) )
{
QMessageBox::information( 0, tr( "Server - Error" ), tr( "bytesAvailable() < sizeof( Q_UINT16)" ) );
return;
}
in >> blocksize;
if( bytesAvailable() < blocksize )
{
QMessageBox::warning( 0, tr( "Server - Error" ), tr( "bytesAvailable() < blocksize" ) );
return;
}
}
QByteArray block;
in >> block;
QString fileName = QFileDialog::getSaveFileName();
QFile file( fileName );
if( !file.open( IO_WriteOnly ) )
{
QMessageBox::warning( 0, tr( "Server - Error" ), tr( "Datei %1 konnte nicht zum Schreiben geöffnet werden!" ).arg( file.name() ) );
return;
}
file.writeBlock( block );
QMessageBox::information( 0, tr( "Server -Information" ), tr( "Schreiben von Datei\n%1\nbeendet." ).arg( file.name() ) );
close();
if( state() == Idle )
deleteLater();
blocksize = 0;
}ich vermute den fehler beim einlesen der datei in das QByteArray, also entweder beim QDataStream, der die daten immernoch ins QByteArray schreibt wenn der block verschickt wird, oder beim "file.readAll()", das immernoch die daten einliest, wenn der block schon verschickt wird.
das sind aber wie gesagt nur vermutungen, und ich bin noch neu bei QT und lerne erst seit einem jahr überhaupt C++. vielleicht zur information noch: ich schreibe das programm ausschließlich in QT3, zur übung, da das buch womit ich mich in QT einarbeite auch nur zu QT3 ist.
danke im voraus für jede hilfe!
mfg,
julian