Czytałem przez Beej's Guide to Network Programming, aby uzyskać uchwyt połączeń TCP. W jednej z próbek kodu klienta dla prostych klienta strumienia TCP wygląda:Obsługa częściowego powrotu z recv() TCP w C
if ((numbytes = recv(sockfd, buf, MAXDATASIZE-1, 0)) == -1) {
perror("recv");
exit(1);
}
buf[numbytes] = '\0';
printf("Client: received '%s'\n", buf);
close(sockfd);
mam ustawić bufor być mniejsza niż całkowita liczba bajtów, które wyślę. Nie jestem całkiem pewien, jak mogę uzyskać inne bajty. Czy muszę przechodzić w pętlę przez recv()
, dopóki nie otrzymam '\0'
?
* Uwaga po stronie serwera Wdrażam również jego funkcję sendall()
, więc powinno być wysyłanie wszystkiego do klienta.
Zobacz także 6.1. A Simple Stream Server w przewodniku.
Jeszcze innym sposobem jest użycie końcowy bajt ze specjalnym wartość (np. ETX), jeśli jesteś pewien, że ta wartość nie może pojawić się w komunikacie lub początek bajtu (STX) i bajt końcowy (ETX). Jest trudniejsze w obsłudze po stronie odbiornika, ale bardziej wytrzymałe. Jeśli coś poszło nie tak i niektóre dane utracone w transmisji, przepływ danych może być łatwo zsynchronizowany ze STX/ETX, ale w przypadku prefiksu długości całe piekło się rozpada. – qrdl