Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Winsocks wysyłanie pliku exe

Ostatnio zmodyfikowano 2012-06-26 21:55
Autor Wiadomość
Katruf
Temat założony przez niniejszego użytkownika
Winsocks wysyłanie pliku exe
» 2012-06-26 21:16:25
Witam,
podczas pisania funkcji wysyłania i odbierania pliku napotkałem na pewien problem, mianowicie gdy wysyłam np plik tekstowy to wszystko działa ale gdy wysyłam plik exe to jak próbuję uruchomić ten plik (aplikacja konsolowa) to pojawia mi się tylko okienko konsoli po czym natychmiast znika ( gdy próbowałem odpalić ten wysłany programik poziomu cmd to wyskoczył mi komunikat "this program cannot be run in DOS mode." a podczas próby uruchomienia z poziomu cmd niewysłanego programu to wszystko działa jak należy )

to jest funkcja wysyłająca plik

int wyslij_plik(int gdzie, string nazwa){
ifstream spr(nazwa.c_str() , ios::in | ios::binary) ;
  spr.seekg(0 , ios::end) ;      
  int rozmiar = spr.tellg();      
  spr.seekg(0 , ios::beg);
  spr.close();
  rozmiar++;
  char bajt[2]={NULL,NULL},pom[2];
  send(gdzie, nazwa.c_str(), nazwa.size()+1, 0);
  recv(gdzie, pom, 2, 0);
  if(pom[0]!='+')return 0;



  send(gdzie, int2str(rozmiar).c_str(), int2str(rozmiar).size()+1, 0);
  recv(gdzie, pom, 2, 0);
  if(pom[0]!='+')return 0;

  fstream strum;
  strum.open(nazwa.c_str(),ios::in||ios::out);

  for(int i=0;i<rozmiar;i++){
  bajt[0]=strum.get();
  bajt[1]=NULL;
  send(gdzie, bajt, 2, 0);
  recv(gdzie, pom, 2, 0);
  if(pom[0]!='+')return 0;
  };

  strum.close();
return 1;
}

a to pobierająca plik

int pobierz_plik(int skond){
  char bajt[2]={NULL,NULL},pom;
  char bufor[200];
  string wiadomosc;

  for(int i=0;i<200;i++)bufor[i]=0;
  recv(skond,bufor, 200, 0);
  string nazwa=bufor;
  send(skond,"+", 2, 0);



  for(int i=0;i<200;i++)bufor[i]=0;
  recv(skond,bufor, 200, 0);
  wiadomosc=bufor;
  int rozmiar=str2int(wiadomosc);
  send(skond,"+", 2, 0);






  fstream strum;
  strum.open(nazwa.c_str(),ios::in|ios::out|ios::binary);

  for(int i=0;i<rozmiar;i++){
  recv(skond,bajt, 2, 0);
  strum.put(bajt[0]);
  send(skond,"+", 2, 0);
  bajt[0]=0;
  };

  strum.close();
return 1;
}

czy może mi ktoś powiedzieć gdzie tu jest błąd i dlaczego na normalnych plikach działa a na exe nie?
P-59179
Drraven
» 2012-06-26 21:54:32
Nie sprawdzałem kodu ale:
Jesli normalne pliki to pliki tekstowe to pewnie z automatu wszystko wysyłasz jako tekst, spróbuj binarnie otworzyć.
P-59183
Katruf
Temat założony przez niniejszego użytkownika
» 2012-06-26 21:55:55
jeśli chodzi Ci o otwarcie pliku w trybie binarnym czyli z flagą ios::binary to tak uczyniłem


/edit:
a sorry miałeś rację zapomniałem w jednym miejscu dodać
powinno być


int wyslij_plik(int gdzie, string nazwa){
ifstream spr(nazwa.c_str() , ios::in | ios::binary) ;
  spr.seekg(0 , ios::end) ;      
  int rozmiar = spr.tellg();      
  spr.seekg(0 , ios::beg);
  spr.close();
  rozmiar++;
  char bajt[2]={NULL,NULL},pom[2];
  send(gdzie, nazwa.c_str(), nazwa.size()+1, 0);
  recv(gdzie, pom, 2, 0);
  if(pom[0]!='+')return 0;



  send(gdzie, int2str(rozmiar).c_str(), int2str(rozmiar).size()+1, 0);
  recv(gdzie, pom, 2, 0);
  if(pom[0]!='+')return 0;

  ifstream strum;
  strum.open(nazwa.c_str(),ios::binary);

  for(int i=0;i<rozmiar;i++){
  bajt[0]=strum.get();
  bajt[1]=NULL;
  send(gdzie, bajt, 2, 0);
  recv(gdzie, pom, 2, 0);
  if(pom[0]!='+')return 0;
  };

  strum.close();
return 1;
}





int pobierz_plik(int skond){
  char bajt[2]={NULL,NULL},pom;
  char bufor[200];
  string wiadomosc;

  for(int i=0;i<200;i++)bufor[i]=0;
  recv(skond,bufor, 200, 0);
  string nazwa=bufor;
  send(skond,"+", 2, 0);



  for(int i=0;i<200;i++)bufor[i]=0;
  recv(skond,bufor, 200, 0);
  wiadomosc=bufor;
  int rozmiar=str2int(wiadomosc);
  send(skond,"+", 2, 0);






  ofstream strum;
  strum.open(nazwa.c_str(),ios::binary);

  for(int i=0;i<rozmiar;i++){
  recv(skond,bajt, 2, 0);
  strum.put(bajt[0]);
  send(skond,"+", 2, 0);
  bajt[0]=0;
  };

  strum.close();
return 1;
}



dzięki za pomoc
P-59184
« 1 »
  Strona 1 z 1