Bild wird nicht richtig übertragen



  • Hallo ich bin immer noch dabei ein Bild von einem PC zu einem anderen PC über ein Netzwerk zu übertragen.

    Ich bin inzwischen soweit das Server und Client sich Verbinden, danach sendet der Server jedoch wird die Datei test2.jpg maximal 4 kb groß, also die schleife wird auch nur einmal durchlaufen, erst wenn ich das senden des Servers abbreche, wird die Datei mit fwrite geschrieben.

    An was kann das liegen?

    Hier der Server Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h> 
    
    int main(int argc, char *argv[])
    {
        int Socket;
        int Socket2;
        int len;
        struct sockaddr_in Adressinfo;
        char* buffer[1024];
        FILE* file = NULL;
    
        /* windows sockets initialisieren */
        WSADATA wsaData;
        if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
        {
            printf("WSA konnte nicht initialisiert werden.\n\n");
            system("PAUSE");
            return 0;
        } 
    
        Socket = socket(AF_INET, SOCK_STREAM, 0);
        Adressinfo.sin_family = AF_INET;
        Adressinfo.sin_addr.s_addr = inet_addr("192.168.2.35");
        Adressinfo.sin_port = htons(3500); 
    
        if (bind(Socket,(struct sockaddr *)&Adressinfo, sizeof(Adressinfo)) == -1)
        {
           printf("Verbindungsaufbau ist fehlgeschlagen!");
        }
        else
        {
            printf("Verbindungsaufbau erfolgreich!");
        }
        printf("Vor Listen...");
        if( listen(Socket, 5 ) == -1 ) {
            printf("Listen schlägt fehl!!");
        }
        printf("Nach Listen...");
    
        while ((Socket2 = accept(Socket,NULL,NULL)) != -1)
        {
              printf("In Schleife...");
              if ((file = fopen("test.JPG", "rb")) == NULL)
              {           
                printf("No file \n");           
              }
              while(!feof(file))
              {
                   len = read(file, buffer, 1024);
                   printf("Sende Bild...");
                   send(Socket2, *buffer, len,0);
              }  
        } 
        printf("Nachp Schleife...");
      system("PAUSE");	
      return 0;
    }
    

    Hier der Client Code:

    #include <stdio.h>
    #include <stdlib.h>
    #include <windows.h> 
    #include <errno.h>
    
    int main(int argc, char *argv[])
    {
        int Socket;
        int Verbindung;
        struct sockaddr_in Adressinfo;
        char* antwort[1024];
        FILE* file;
    
        /* windows sockets initialisieren */
        WSADATA wsaData;
        if(WSAStartup(MAKEWORD(1,1), &wsaData) != 0)
        {
            printf("WSA konnte nicht initialisiert werden.\n\n");
            system("PAUSE");
            return 0;
        } 
    
        Socket = socket(AF_INET, SOCK_STREAM, 0);
        Adressinfo.sin_family = AF_INET;
        Adressinfo.sin_addr.s_addr = inet_addr("192.168.2.35");
        Adressinfo.sin_port = htons(3500); 
        printf("Vor Connect...");
        Verbindung = connect(Socket, (struct sockaddr *)&Adressinfo, sizeof(Adressinfo));
        printf("Nach Connect...");
        if (Verbindung == -1)
        {
           printf("Verbindungsaufbau ist fehlgeschlagen!");
        }       
        else
        {
            printf("Verbindungsaufbau erfolgreich!");
        }
        printf("Vor Senden...");
        if ((file = fopen("test2.JPG", "w+wb")) == NULL)
        {
           printf("No file \n");   
        }
        printf("Nach Senden...");
        while(Verbindung!=SOCKET_ERROR)
        {
    
            Verbindung=recv(Socket,&antwort,sizeof(antwort),0);
            printf("Vor Write...");
            fwrite(antwort,sizeof(antwort),1,file);
            printf("Nach Write...");
        }
        if(Verbindung == 0)
        {
            printf("Server hat die Verbindung getrennt..\n");
        }  
        close(Socket);
        WSACleanup();
        fclose(file); 
        system("PAUSE");	
        return 0;
    }
    

    Gruß Marco



  • ^^ du musst die rückgabewerte von send/recv richtig auswerten. send kann (und macht es auch oft) weniger senden, als du möchtest. und recv gibt dir auch nur soviel, wie gerade da ist und nicht immer einen vollen buffer, wovon dein programm dummerweise ausgeht.
    🙂



  • und wie mache ich das? also wie kann ich feststellen wieviel byte ich in die datei schreiben muss??

    gruß marco



  • marcoz schrieb:

    und wie mache ich das? also wie kann ich feststellen wieviel byte ich in die datei schreiben muss??

    beim senden: ist der rückgabewert kleiner als die anzahl bytes die du senden willst, aber nicht kleiner als 0, dann musste den rest etwas später hinterherschicken.
    beim empfang: immer nur soviel in die datei schreiben, wie 'recv' mit dem rückgabewert anzeigt.
    ausnahmen: fehlercodes als rückgabewerte sind keine längenangaben (SOCKET_ERROR ist, glaub ich, < 0). gibt recv 0 zurück, wurde die verbindung beendet.
    🙂



  • wie den rest etwas später hinterherschicken?

    also einfach den rückgabewert von recv als länge nehmen?

    hast mir vllt n codeschnipsel??

    gruß marco



  • marcoz schrieb:

    wie den rest etwas später hinterherschicken?

    ja, genau das.

    marcoz schrieb:

    also einfach den rückgabewert von recv als länge nehmen?

    ja, ist mein deutsch wirklich so mies wie ich immer glaube?

    marcoz schrieb:

    hast mir vllt n codeschnipsel??

    schau mal in die MSDN, da müsste was drin sein.
    🙂


Anmelden zum Antworten