Socket wysyłanie pliku

0

Witam, nie jestem jakimś zaawansowanym programistą języka C++, ale staram się na tyle ile mogę.
Piszę pewien mały programik, działa on praktycznie tak jak zaplanowałem (głównie opiera się o socket-client).
Mam w nim problem z wysyłaniem pliku muzycznego (gdyż takie będą wysyłane), robię to następująco:

char sndBuf[4000];
FILE *p;

	p = fopen("1.mp3","r");
	while(fgets(sndBuf, 3200, p) != NULL){
		send(sockfd,sndBuf,sizeof(sndBuf),0);
		cout << sndBuf << endl;
	}

Problem jest w tym, że plik podczas odtwarzania bardzo często przerywa i wydaje mi się, że problemem tutaj jest buffer lub sam sposób jego obliczania. Może otwieranie za pomocą fopen nie jest również dobrym pomysłem? Kombinowałem również z ifstream, ale tutaj w ogóle mi to coś nie chciało działać.

Będę wdzięczny za pomoc, pozdrawiam!

0

Otwieraj go z flagą "rb" a nie samo "r" bo to plik binarny a nie tekstowy.

0

Nadal to samo :/

1

send(sockfd,sndBuf,strlen(sndBuf),0);
poza tym i tak będzie przerywać bo nie wiesz czy fgets wczytał ci do entera czy do długości bufora.
Użyj http://www.cplusplus.com/reference/cstdio/fread/

0

Masz rację, nadal przerywa.
Próbuję z tym fread ale to mi w ogóle nie chce działać coś.

1

Jeszcze jedna rzecz, dość istotna - wywołanie send nie daje gwarancji, że zostanie wysłany cały bufor. Funkcja zwraca ilość wysłanych danych i w razie potrzeby musisz znowu wysłać to co nie poszło.

0

Zrobiłem coś takiego:

FILE *f;
char buffer[4096];
int size;
	if ((f = fopen("1.mp3", "rb")) != NULL)
	{
		fseek (f, 0, SEEK_END);
		size=ftell(f);
		fread(buffer, size, 1, f);
		send(sockfd,buffer,sizeof(buffer),0);
	}

Ale to w ogóle nie działa.

0
  1. co próbujesz odczytać po końcu pliku?
  2. buffer ma 4KB a próbujesz odczytać cały plik niczego nie sprawdzając, poczytaj o dynamicznym przydzielaniu pamięci.
  3. byku_guzio dał cenną wskazówkę którą zwyczajnie zignorowałeś.
0
  1. Dodałem fclose.
  2. Buffer zwiększony (plik ma 3,17MB) tak, aby zmieścił się w nim.
  3. Na razie nie zawracam sobie tym głowy, aż zacznie coś grać.
    Nie działa nadal.
FILE *f;
char buffer[3323986];
int size;
	if ((f = fopen("1.mp3", "rb")) != NULL)
	{
		fseek (f, 0, SEEK_END);
		size=ftell(f);
		fread(buffer, size, 1, f);
		send(sockfd,buffer,sizeof(buffer),0);
		fclose(f);
	}
0

W tym momencie to nie ma prawa działać, pewnie nawet jakbyś prawidłowo przeczytał plik to by się nie udało - szansa, że send wyśle Ci ten plik w całości jest dość bardzo bliska zeru

0

Dlatego właśnie piszę na forum, aby ktoś chętny mi w tym pomógł, bo sobie nie radzę z tym. :)

0

Przecież już chyba wszystko w temacie zostało powiedziane. W tym ostatnim kodzie najpierw przesuwasz się na koniec pliku, a potem próbujesz z niego czytać. Może wypadałoby tak wrócić na początek?

0

Niestety nie potrafię sobie z tym poradzić, pomimo skorzystania z kilku przykładów z Internetu - myślę, że one też maja jakieś błędy.
Raczkuję jeżeli chodzi o operacje na plikach, mam jedynie podstawową wiedzę o C++.

Byłbym wdzięczy jeżeli ktoś pomógłby mi to napisać.

0

Taką pomoc o jaką prosisz dostaniesz w dziale praca, odpłatnie oczywiście.

1 użytkowników online, w tym zalogowanych: 0, gości: 1