JPG über sockets!



  • Das könnte daran liegen, dass recv nicht unbedingt immer alle Daten empfängt. Überprüf doch mal den Return-Wert von recv und du brauchst wohl eine Schleife, die solange empfängt, bis die Daten da sind. Oder auch 'ne Hilfsfunktion, die ungefähr so aussieht:

    bool RecvData( SOCKET s, char* data, size_t bytes )
    {
        size_t bytes_read = 0;
        while ( bytes_read != bytes )
        {
            int r = recv( s, data+bytes_read, bytes-bytes_read, 0 );
    
            // Grad keine Daten zum empfangen da?
            if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK )
                Sleep( 20 );
            // Fehler bzw Verbindung geschlossen?
            else if ( r <= 0 )
                return false;
            else
                bytes_read += r;
        }
        return true;
    }
    

    edit: Der Code ist ungetestet. Und recv kann halt z.B. beim ersten Aufruf nur 5 Bytes empfangen, beim zweiten noch ein paar und beim dritten den Rest. Oder so, jedenfalls wartet es nicht, bis man die angegebene Anzahl an Bytes empfangen hat.



  • danke 🙂
    jetzt wird die jpg jedes mal erstellt aber sie hat zirka 15 mb und kann nicht angezeigt werden 😞

    #include <windows.h>
    #include <iostream>
    #include <vector>
    #include <fstream>
    
    using namespace std;
    
    char* RecvData( SOCKET s, size_t bytes );
    
    int main()
    {
     	WSADATA wsa;
    	SOCKADDR_IN addr;
    	int rc;
    	SOCKET acceptSocket, connectedSocket;
    	if(WSAStartup(MAKEWORD(2,0), &wsa) != 0)
    	{
    		cout << "Socket konnte nicht gestartet werden" << endl;
    	}
    	acceptSocket = socket(AF_INET,SOCK_STREAM,0);
    	if(acceptSocket==INVALID_SOCKET)
    	{
    		cout << "Socket konnte nicht erstellt werden" << endl;
    	}
    	memset(&addr,0,sizeof(SOCKADDR_IN));
    	addr.sin_family=AF_INET;
    	addr.sin_port=htons(40791);
    	addr.sin_addr.s_addr=INADDR_ANY;
    	if(bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
    	{
    		cout << "Socket konnte nicht gebindet werden" << endl;
    	}
    	if(listen(acceptSocket,10)==SOCKET_ERROR)
    	{
    		cout << "listen ist fehlgeschlagen" << endl;
    	}
    	connectedSocket=accept(acceptSocket,NULL,NULL);
    	if(connectedSocket==INVALID_SOCKET)
    	{
    		cout << "Socket konnte nicht akzeptiert werden" << endl;
    	}
    	size_t length;
    	recv(connectedSocket, (char *)&length, sizeof(length), 0);
    	cout << length << endl;
    	char *buffer = RecvData(connectedSocket, length);
    	int i = 0;
        ofstream Zieldatei("tmp.jpg");          
        if (!Zieldatei)                             // Fehler beim Öffnen?
    		cerr << "Ausgabe-Datei kann nicht geöffnet werden\n"; 
        else {            // falls es funktioniert hat 
    		while(i != length)
            Zieldatei.put(buffer[i]);   
    		cout << "erfolgreicht" << endl;
    	}
    	system("PAUSE");
    	return 0;
    }
    
    char* RecvData( SOCKET s, size_t bytes )
    {
        size_t bytes_read = 0;
    	static char tempBuff[1000000];
        while ( bytes_read != bytes )
        {
            int r = recv( s, tempBuff+bytes_read, bytes-bytes_read, 0 );
    
            // Grad keine Daten zum empfangen da?
            if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK )
                Sleep( 20 );
            // Fehler bzw Verbindung geschlossen?
            else if ( r <= 0 )
                return false;
            else
                bytes_read += r;
        }
        return tempBuff;
    }
    


  • Also das mit dem tempBuff in RecvData ist aber ein bisschen dreckig 😃 Was gibt der Server denn bei cout << length << endl; aus?



  • genau das gleiche wie der Client.
    Also immer so 2 kb mehr wie die dateigröße von jpg.



  • Also immer so 2 kb mehr wie die dateigröße von jpg.
    Es sollten aber eigentlich nur 4 Bytes mehr sein 😕

    Zieldatei.put(buffer[i]); => Zieldatei.put(buffer[i++]); ? 🙂

    Bzw

    ofstream Zieldatei( "tmp.jpg", ios::binary ); // Wichtig, das "binary" nicht vergessen!
    ...
    Zieldatei.write( buffer, length );
    


  • upsi, da hab ich wohl das ++ vergessen *schäm*
    jetzt kommen wir der sache schon verdammt nahe!
    Die datei aht ne normale größe und kann angezeigt werden.
    Aber wenn ich sie öffne erstehen solche bilder:
    http://img224.imageshack.us/my.php?image=tmpsm1.jpg
    (soll ein screen vom desktop sein)



  • Na also, fast! 😃

    Hast du auch das ios::binary zum ofstream hinzugefügt? Und wie sehen die Dateigrößen aus, sind sie gleich? Ansonsten kannst du sie mal im Visual Studio binär öffnen und nach Unterschieden suchen, vielleicht fällt dir was auf.



  • sry hatte vorhin das mit binary übersehen.

    juhuuu es geht jetzt endlich 🙂 🙂 🙂 🙂
    du bist der beste
    1000 mal danke



  • Hehe, gerne! Freut mich, dass ich helfen konnte 🙂



  • mist, wollte jetzt statt jpg auch bmps verschicken aber das programm stürzt ab!

    #include <windows.h>
    #include <iostream>
    #include <vector>
    #include <fstream>
    
    using namespace std;
    
    char* RecvData( SOCKET s, size_t bytes );
    
    int main()
    {
     	WSADATA wsa;
    	SOCKADDR_IN addr;
    	int rc;
    	SOCKET acceptSocket, connectedSocket;
    	if(WSAStartup(MAKEWORD(2,0), &wsa) != 0)
    	{
    		cout << "Socket konnte nicht gestartet werden" << endl;
    	}
    	acceptSocket = socket(AF_INET,SOCK_STREAM,0);
    	if(acceptSocket==INVALID_SOCKET)
    	{
    		cout << "Socket konnte nicht erstellt werden" << endl;
    	}
    	memset(&addr,0,sizeof(SOCKADDR_IN));
    	addr.sin_family=AF_INET;
    	addr.sin_port=htons(40791);
    	addr.sin_addr.s_addr=INADDR_ANY;
    	if(bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
    	{
    		cout << "Socket konnte nicht gebindet werden" << endl;
    	}
    	if(listen(acceptSocket,10)==SOCKET_ERROR)
    	{
    		cout << "listen ist fehlgeschlagen" << endl;
    	}
    	connectedSocket=accept(acceptSocket,NULL,NULL);
    	if(connectedSocket==INVALID_SOCKET)
    	{
    		cout << "Socket konnte nicht akzeptiert werden" << endl;
    	}
    	size_t length;
    	recv(connectedSocket, (char *)&length, sizeof(length), 0);
    	cout << length << endl;
    	char *buffer = RecvData(connectedSocket, length);
        ofstream Zieldatei("tmp.bmp", ios::binary);   
    	int i = 0;
        if (!Zieldatei)                             // Fehler beim Öffnen?
    		cerr << "Ausgabe-Datei kann nicht geöffnet werden\n"; 
        else {            // falls es funktioniert hat 
    
            while(i != length) 
            Zieldatei.put(buffer[i++]);   // hier stürtzt es ab, genauso mit write
    	}
    
    	Zieldatei.close();
    	system("PAUSE");
    	return 0;
    }
    
    char* RecvData( SOCKET s, size_t bytes )
    {
        size_t bytes_read = 0;
    	static char tempBuff[100000];
        while ( bytes_read != bytes )
        {
            int r = recv( s, tempBuff+bytes_read, bytes-bytes_read, 0 );
    
            // Grad keine Daten zum empfangen da?
            if ( r==-1 && WSAGetLastError()==WSAEWOULDBLOCK )
                Sleep( 20 );
            // Fehler bzw Verbindung geschlossen?
            else if ( r <= 0 )
                return false;
            else
                bytes_read += r;
        }
        return tempBuff;
    }
    


  • Eventuell platzt dein static Puffer aus RecvData?


Anmelden zum Antworten