Winsock datei sende problem



  • Stefan311 schrieb:

    Bei mir ist Server Sender
    und Client empfänger)

    Im Grunde ist es egal nachdem Verbindung aufgebaut ist



  • Dtei größe stimmt doch nicht.Empfangene=1,01 MB (1.060.855 Bytes),Original=1,01 MB (1.060.859 Bytes)
    Server(ist hoffentlich ein wenig verstänlicher ich hab jetzt erstmal dein code eingesetzt)

    #include <windows.h> 
    #include <process.h>
    #include <winsock2.h> 
    #include <iostream>
    #include <stdio.h> 
    #include <stdlib.h>
    #include <conio.h>
    #include <fstream>
    #include <sys/types.h>
    #include <sys/stat.h>
    using namespace std;
    void warte(void *ch);
    int startWinsock(void); 
    int a=0;
    int i;
    int b=0;
    
    int end=0;
     long rc;
     SOCKET cs; 
     char ausgabe1[300];
    int main() 
    { 
    
    char test[300];
    
      SOCKET acceptSocket; 
    FILE *file; 
        char buf[1024]; 
        int num; 
      SOCKADDR_IN addr; 
    
      // Winsock starten 
    char datei[] = "update/upms.exe";
      rc=startWinsock(); 
    
      if(rc!=0) 
    
      { 
    
        printf("Fehler: startWinsock, fehler code: %d\n",rc); 
    
        return 1; 
    
      } 
    
      else 
    
      { 
    
        printf("Winsock gestartet!\n"); 
    
      } 
    
      // Socket erstellen 
    
      acceptSocket=socket(AF_INET,SOCK_STREAM,0); 
    
      if(acceptSocket==INVALID_SOCKET) 
    
      { 
    
        printf("Fehler: Der Socket konnte nicht erstellt werden, fehler code: %d\n",WSAGetLastError()); 
    
        return 1; 
    
      } 
    
      else 
    
      { 
    
        printf("Socket erstellt!\n"); 
    
      } 
    
    	a=1;
    memset(&addr,0,sizeof(SOCKADDR_IN)); 
    
    addr.sin_family=AF_INET; 
    
    addr.sin_port=htons(81); 
    
    addr.sin_addr.s_addr=ADDR_ANY; 
    
    rc=bind(acceptSocket,(SOCKADDR*)&addr,sizeof(SOCKADDR_IN)); 
    listen:
    if(rc==SOCKET_ERROR) 
    
    { 
    
      printf("Fehler: bind, fehler code: %d\n",WSAGetLastError()); 
    
      return 1; 
    
    } 
    
    else 
    
    { 
    
      printf("Socket an port 81 gebunden\n"); 
    
    } 
    
    rc=listen(acceptSocket,10); 
    
    if(rc==SOCKET_ERROR) 
    
    { 
    
      printf("Fehler: listen, fehler code: %d\n",WSAGetLastError()); 
    
      return 1; 
    
    } 
    
    else 
    
    { 
    
      printf("acceptSocket ist im listen Modus....\n");  
    
    } 
    
    cs=accept(acceptSocket,NULL,NULL);
    
    if(cs==INVALID_SOCKET) 
    
    { 
    b=1;
      printf("Fehler: accept, fehler code: %d\n",WSAGetLastError()); 
    
      return 1; 
    
    } 
    
    else 
    
    { 
    
      printf("Neue Verbindung wurde akzeptiert!\n"); 
    
    } 
    
    if(rc==SOCKET_ERROR) 
    {
    	cout<<"Fehler: Sende port reagiert nicht!";
    
    }
    
    rc = recv(cs,buf,8,0);
    if(buf[0]=='2' && buf[1]=='.' && buf[2]=='5' )
    {
    	buf[0]='0';
    		rc = send(cs,buf,3,0);
    		cout<<"\nBitte neu starten update Fertig!";
    		cin.get();
    		return 0;
    }
    else
    {
    
    buf[0]='1';
    		rc = send(cs,buf,3,0);
    
    }
    
    char *buf2;
    	buf2=new char(1024);
    
    if( (file = fopen(datei, "rb")) == NULL ) 
        { 
            printf("Fehler: Datei %s kann nicht geoffnet werden\n\n", datei); 
            return 1; 
        } 
    
     printf("Sende Datei... "); 
        while( !feof(file) ) 
        { 
            num = 0; 
            num = fread(buf, sizeof(char), sizeof(buf), file); 
            num = send(cs, buf, num, 0); 
            if( num == SOCKET_ERROR ) 
            { 
                printf("\nFehler: Fehler beim senden aufgetreten\n\n"); 
                return 1; 
            } 
            printf(".");   
        } 
        printf("\nDatei erfolgreich versendet!\n\n"); 
    
        fclose(file); 
        closesocket(cs); 
        WSACleanup(); 
    
        cout<<"\nBitte neu starten update Fertig!";
    cin.get();
    return 0; 
    }
    
    int startWinsock(void) 
    
    { 
    
      WSADATA wsa; 
    
      return WSAStartup(MAKEWORD(2,0),&wsa); 
    
    }
    

    Client:

    #include "headers\magicaklass.h"
    using namespace std;
    
    int update()
    {
    
    //Prototypen
    
    int startWinsock(void);
     long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
    
      char ausgabe1[300];
     	int b=0;
    int end=0;
      	long rc;
    SOCKET s; 
      SOCKADDR_IN addr; 
    
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);
      char buf[200];
      char test[255];
      char hostname1[200];	
    
    /*hostname1[0]='1';
    hostname1[1]='2';
    hostname1[2]='7';
    hostname1[3]='.';
    hostname1[4]='0';
    hostname1[5]='.';
    hostname1[6]='0';
    hostname1[7]='.';
    hostname1[8]='1';*/
    //hostname1[9]='i';
    //hostname1[10]='l';
    /*hostname1[11]='a';
    hostname1[12]='s';
    hostname1[13]='.';
    hostname1[14]='d';
    hostname1[15]='y';
    hostname1[16]='n';
    hostname1[17]='d';
    hostname1[18]='n';
    hostname1[19]='s';
    hostname1[20]='.';
    hostname1[21]='o';
    hostname1[22]='r';
    hostname1[23]='g';*/
    
    gets(hostname1);
    gets(hostname1);
    
     rc=startWinsock(); 
      if(rc!=0)
    
      {
    
        printf("Fehler: Update kann nicht ausgeführt werden.\nstartWinsock, fehler code: %d\n",rc);
    
        return 1;
    
      }
    
      s=socket(AF_INET,SOCK_STREAM,0); 
    
    if(s==INVALID_SOCKET) 
    
    { 
    
      printf("Fehler: Update kann nich ausgeführt werden.\nSocketfehler code: %d\n",WSAGetLastError()); 
    
      return 1; 
    
    } 
    
       // we use the overloaded <<
    
     memset(&addr,0,sizeof(SOCKADDR_IN)); // zuerst alles auf 0 setzten  
    
    addr.sin_family=AF_INET; 
    
    addr.sin_port=htons(81); // wir verwenden mal port 12345 
    
      rc=getAddrFromString(hostname1,&addr);
     rc=connect(s,(SOCKADDR*)&addr,sizeof(SOCKADDR));
    
    if(rc==SOCKET_ERROR)  
      {    printf("Fehler keine Verbindung zum Host!");   
      cin.get();
      cin.get();
       Hauptmenue(); 
       }
    
    buf[0]='2';
    buf[1]='.';
    buf[2]='5';
    rc = send(s,buf,5,0);
    rc = recv(s,buf,7,0);
    if(buf[0]=='0')
    {
    	cout<<"\nSie haben bereits die neueste Version.\n";
    	Hauptmenue();
    }
    
    	char datei[] = "upms.exe";            // Datei path 
     int num; 
    				char buf2[1024];
    FILE *file; 
    file = fopen(datei, "wb");
        printf("Datei %s zum schreiben geoffnet\n", datei); 
    cin.get();
    
        printf("\nEmpfange Datei...\nBitte warten... "); 
        while( (num = recv(s, buf, sizeof(buf), 0)) > 0 ) 
        { 
            fwrite(buf, sizeof(char), num, file); 
            printf("."); 
        } 
        printf("\nDatei empfangen!\n\n"); 
        fclose(file); 
        closesocket(s); 
        WSACleanup(); 
    
    cout<<"\nDas Programm wird jetzt ausgeschaltet.F"<<(char)129<<"hren sie bitte upsm.exe aus.\n";
    Sleep(3000);
    
    return 0;
    
    } 
    
    int startWinsock(void) 
    
    { 
    
      WSADATA wsa; 
    
      return WSAStartup(MAKEWORD(2,0),&wsa); 
    
    }
        long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr)
    
    {
    
      long rc;
    
      unsigned long ip;
    
      HOSTENT* he;
      // Parameter prüfen 
    
      if(hostnameOrIp==NULL || addr==NULL)
    
        return SOCKET_ERROR;
      // eine IP in hostnameOrIp ? 
    
      ip=inet_addr(hostnameOrIp);
      // bei einem fehler liefert inet_addr den Rückgabewert INADDR_NONE 
    
      if(ip!=INADDR_NONE)
    
      {
    
        addr->sin_addr.s_addr=ip;
    
        return 0;
    
      }
    
      else
    
      {
    
        //Hostname in hostnameOrIp auflösen 
    
        he=gethostbyname(hostnameOrIp);
    
        if(he==NULL)
    
        {
    
          return SOCKET_ERROR;
    
        }
    
        else
    
        {
    
          //die 4 Bytes der IP von he nach addr kopieren 
    
          memcpy(&(addr->sin_addr),he->h_addr_list[0],4);
    
        }
    
        return 0;
    
      }
    
    }
    


  • Ah du kake 😮 😮 😮

    Stefan ich gebe dir ein Rat, lösche alles und fange von vorne an.

    --------------------------------------------------------------------------
    Falsch:
    rc = send(s,buf,5,0);
    rc = recv(s,buf,7,0);
    Richtig:
    rc = send(s, buf, strlen(buf), 0);
    rc = recv(s, buf, sizeof(buf), 0);
    ____________________________________________________________________________

    gets(hostname1); wieso gleich zwei mal? 😕
    gets(hostname1);
    ___________________________________________________________________________

    /hostname1[0]='1';
    hostname1[1]='2';
    hostname1[2]='7';
    hostname1[3]='.';
    hostname1[4]='0';
    hostname1[5]='.';
    hostname1[6]='0';
    hostname1[7]='.';
    hostname1[8]='1';
    /
    //hostname1[9]='i';
    //hostname1[10]='l';
    /hostname1[11]='a';
    hostname1[12]='s';
    hostname1[13]='.';
    hostname1[14]='d';
    hostname1[15]='y';
    hostname1[16]='n';
    hostname1[17]='d';
    hostname1[18]='n';
    hostname1[19]='s';
    hostname1[20]='.';
    hostname1[21]='o';
    hostname1[22]='r';
    hostname1[23]='g';
    /

    Was ist das?????? dafür gibt es strcpy();
    _______________________________________________________________________

    int update()
    {

    //Prototypen

    int startWinsock(void);
    long getAddrFromString(char* hostnameOrIp, SOCKADDR_IN* addr);

    char ausgabe1[300];
    int b=0;
    int end=0;
    long rc;
    SOCKET s;
    SOCKADDR_IN addr;

    Prototypen inerhalb einer Funktion ??? hmmm 🙄
    ______________________________________________________________________________

    Falsch
    char datei[] = "update/upms.exe";
    Richtig
    char datei[] = "C:\\blabla\\update\\upms.exe";

    __________________________________________________________________

    Falsch
    char *buf2;
    buf2=new char(1024); // <<<<<<<<<<<<<<<<<<<<<<

    Richtig
    char *buf2;
    buf2 = new char[1024];

    An freigabe denken "delete"
    _____________________________________________________________________

    Und das sind noch lange nicht alle Fehler 😞
    Also schau nochmal den Beispiel von oben, und besser
    kompiliere die beiden und starte sie dann.
    Ich wundere mich dass da überhaupt was funktioniert hat.



  • Gut das it strcpy wuste ich nicht und mit strlen auch nicht.
    Ups >> Prototypen
    mitchar datei[] = "update/upms.exe";
    das guckt er nur um programm ordner wo es ausgeführt wird.
    und / geht auch anstatt \.
    Aber gut ich werdenoch mal alles komplett neu schreiben.





  • allerunterste Schublade schrieb:

    trojaner@mail.ru

    👎 👎 👎 👎 👎 👎 👎

    Was geht dir an wie meine mail lautet?????

    Ich weiss, weill du Angst von solchen Sachen hast 😃 😃 😃



  • Jetzt klappt alles danke.



  • num = 0;
            num = fread(buf, sizeof(char), sizeof(buf), file);
            num = send(cs, buf, num, 0);
            if( num == SOCKET_ERROR )
            {
                printf("\nFehler: Fehler beim senden aufgetreten\n\n");
                return 1;
            }
            printf(".");
    

    so geht das nicht. send muss nicht immer wirklick num bytes senden. wenn send jetzt nur die hälfte deines buffers sendet, liest du beim nächsten schleifen durchlauf trotzdem nen kompletten neuen buffer ein und die verbleibenden nicht gesendeten bytes sind verloren. das prob tritt bei dir im netzwerk vermutlich nicht auf aber im richtigen einsatz durchaus



  • hm oder wenn es blocking sockets sind gehts vielleicht doch, weiss ned ob der dann so lange blockt bis alles gesendet ist was du bei size angegeben hast aber wahrscheinlich 🤡



  • ich möchte an dieser stelle nur nochmal andeuten dass das von mir gepostete programm nicht von mir ist.

    desweiteren:
    interesanter thread und wie hier schon einige gesagt haben solltest du alles nochmal neu machen... am besten nochmal ein par gute turtorials lesen da dein wissen sehr lückehaft erscheint:
    http://www.pc-adviser.de/socket_programmierung.html
    http://www.excluded.ath.cx/papers/NetworkC.htm

    P.S.:
    kann es sein dass uns hier ein unregestrierter user nervt?^^
    Oder ist es einfach der fall das 60% aller komentaren unregestrierter user
    schwachsinnig sind?



  • 😞


Anmelden zum Antworten