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? |
|
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ć. |
|
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 |
|
« 1 » |