witam, robię mały projekcik, w którym znaczną rolę miałoby zajmować przesyłanie plików pomiędzy serwerem napisanym w c++ a klientem w javie. Mój problem polega na tym, że często(czasem jednak plik dochodzi w calości) zdarza się, że plik nie kończy się przesyłać(serwer przesyła wszystkie pakiety - klient zatrzymuje się przy odbieraniu ostatniego z nich). Siedzę nad tym już od dłuższego czasu, jeśli ktoś wskaże błąd jaki popełniam, będę bardzo wdzięczny. W razie gdybyście potrzebowali więcej info, piszta ;)
Kod metody odbierającej plik(java):
void recvFile() throws FileNotFoundException, IOException, InterruptedException {
File random = new File("rand.wav");
System.out.println("plik zostanie zapisany jako " + random.getName());
int size;
byte[] bufor = new byte[1024];
out.print("FileRequest");
out.flush();
size = inStream.read(bufor); System.out.println("rozmiarr przed obrobka:"+size);
size = bytesToInt(bufor);
System.out.println("rozmiar po obrobce :" + size);
byte[] mybytearray = new byte[size];
FileOutputStream fileOutputStream = new FileOutputStream(random);
BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(fileOutputStream);
int bytesRead;
int currentSize = 0;
do {
bytesRead = inStream.read(mybytearray, currentSize, mybytearray.length - currentSize);
if (bytesRead >= 0) {
currentSize += bytesRead;
System.out.println("sciagnieto: " + currentSize + " z " + size );
System.out.println("odczytano w jednym pakiecie: " + bytesRead);
}
} while (currentSize < size );
System.out.println("wyszedlem z petli");
bufferedOutputStream.write(mybytearray, 0, currentSize);
bufferedOutputStream.flush();
bufferedOutputStream.close();
}
Kod funkcji wysyłającej plik(C++):
void wyslijPlik(int gn) {
printf("zaczynam wysylac\n");
char sciezka[512]="rand.wav";
long dl_pliku, wyslano, wyslano_razem, przeczytano;
struct stat fileinfo;
FILE* plik;
unsigned char bufor[1024];
printf("Potomny: klient chce plik %s\n", sciezka);
if (stat(sciezka, &fileinfo) < 0) {
printf("Potomny: nie moge pobrac informacji o pliku\n");
return;
}
if (fileinfo.st_size == 0) {
printf("Potomny: rozmiar pliku 0\n");
return;
}
printf("Potomny: dlugosc pliku: %d\n", fileinfo.st_size);
dl_pliku = htonl((long) fileinfo.st_size);
if (send(gn, &dl_pliku, sizeof (long), 0) != sizeof (long)) {
printf("Potomny: blad przy wysylaniu wielkosci pliku\n");
return;
}
dl_pliku = fileinfo.st_size;
wyslano_razem = 0;
plik = fopen(sciezka, "rb");
if (plik == NULL) {
printf("Potomny: blad przy otwarciu pliku\n");
return;
}
while (wyslano_razem < dl_pliku) {
przeczytano = fread(bufor, 1, 1024, plik);
wyslano = send(gn, bufor, przeczytano, 0);
if (przeczytano != wyslano)
break;
wyslano_razem += wyslano;
printf("Potomny: wyslano razem %d bajtow\n, w jednym pakiecie %d", wyslano_razem, wyslano);
}
if (wyslano_razem == dl_pliku)
printf("Potomny: plik wyslany poprawnie\n");
else
printf("Potomny: blad przy wysylaniu pliku\n");
fclose(plik);
return;
}