QT3: dateien mit QSocket verschicken



  • hi,
    ich brauche etwas hilfe für ein kleines chatprogramm, mit dem auch dateien über das netzwerk versendet werden sollen, und hier liegt auch das problem.
    ich benutze qt3, da das programm für linux und windows kompiliert werden soll, kann also keinen plattformabhängigen code verwenden, könnte aber auch die c++-stand_art-library benutzen.
    hier mein kleines testprogramm (die relevanten teile davon):

    client.cpp:

    #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() );
    }
    

    server.cpp:

    #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;
    }
    

    vielleicht ist auch mein ansatz ganz falsch, ich weiss es nicht, ich bekomme jedenfalls immer die meldung (vom server), dass die im paket mitgesendete blockgöße größer der zur verfügung stehenden bytes ist ("bytesAvailable() < blocksize").

    ich habe gerade mal die überprüfung der blockgröße und der bytesAvailable (da wo immer der fehler war) rausgenommen, und es wird komischer weise immer nur ein kleiner teil der datei gesendet. von einer jpg mit 1280x1024 pixel (168kb) kommen die ersten paar zeilen an, der rest des bildes ist einfch grau (empfangenes bild ist aber immernoch 1280x1024 groß, nur eben zu 90% grau). ein bild mit 50x40 pixeln (4kb) kommt aber ganz und ohne probleme an. also liegt es wahrscheinlich am client, der nur eine bestimmte anzahl an bytes sendet. aber warum ?? qsocket arbeitet doch dachte ich nicht asynchron, arbeitet also erst die aktion ab (senden der daten), bevor es im code weitergeht. kann es vielleicht sein, dass es beim qdatastream anders ist, also noch nicht alle daten in das qbytearray geschrieben wurden, der block (das bytearray) aber schon gesendet wird? wenn ja, was kann man tun (wie finde ich heraus, wann die ganze datei eingelesen wurde?)?. ich sitze seit einigen tagen daran, habe x mal google befragt und in diversen qt-foren geschaut, wo das thema schon öfters angesprochen, aber immer ohne ein richtiges ergebnis (bzw. für mich brauchbares/verständliches ergebnis) abgeschlossen wurde.

    ich hoffe auf einen tipp, wie ich eine datei per QSocket im netzwerk versendet bekomme. danke schonmal für jede hilfe!

    mfg,
    julian



  • ok wen es interessiert, für den habe ich HIER die lösung des problems.

    guten rutsch!

    mfg,
    julian


Anmelden zum Antworten