Powyższy kod oznacza tyle:
- przeczytaj dane z gniazdka
s, umieść je w tablicy
odp, której wielkość wynosi
2048, i zwróć ilość przeczytanych bajtów.
Biorąc pod uwagę powyższe, jasnym jest że program nie pobierze strony, która jest większa niż 2048 bajtów - bo tyle się tylko może zmieścić w buforze przekazanym do funkcji recv.
Jeśli się przekaże większy bufor, nie zostanie on wypełniony w całości - dlatego w końcowej jego części będą znajdować się śmiecie.
(dygresja: tekst w C jest zapisywany jako tablica bajtów, kończąca się znakiem '\0' (czyli po prostu bajtem o wartości 0). Funkcja recv nie dodaje bajtu zerowego na koniec bufora (bo funkcja recv ma operować na dowolnych tablicach, nie tylko tekstowych). Dlatego więc, po przekazaniu takiej tablicy do funkcji printf z formatem %s, który oczekuje bajtu zerowego na końcu łańcucha znaków śmiecie lądują na ekranie. Koniec dygresji)
Wracając do tematu, po pierwsze należy przeczytać stronę podręcznika systemowego o funkcji recv:
, ewentualnie o funkcji read:
(funkcja recv z ostatnim parametrem równym zero jest równoważna funkcji read). Potem, dane trzeba czytać w pętli, aż recv/read nie zwróci 0, oznaczającego koniec pliku/strumienia:
Kod: Zaznacz cały
char buffer[BUFFER_SIZE];
size_t bytes_read = read (s, buffer, BUFFER_SIZE);
while (bytes_read > 0) {
fprintf (buffer, 1, bytes_read, stdout); /* Wypisanie danych na ekran */
bytes_read = read (s, buffer, BUFFER_SIZE); /* Pobranie nowych danych */
}
EDIT:
kompilator wyrzuca brak deklaracji elementu cout?
cout znajduje się w przestrzeni nazw std, więc trzeba albo odwoływać się do std::cout, albo gdzieś na górze programu dopisać "using namespace std;", wtedy wszystki symbole z przestrzeni std będą dostępne w głównej przestrzni nazw.