Jaka jest minimalna liczba bajtów, które spowodują zwrot Socket.Receive?

Używamy protokołu aplikacji, który określa wskaźnik długości wiadomości w pierwszych 4 bajtach. Socket.Receive zwróci tyle danych, ile w stosie protokołu w czasie lub bloku, aż do momentu, gdy dane będą dostępne. Dlatego musimy ciągle czytać z gniazda, aż otrzymamy liczbę bajtów na wskaźniku długości. Socket.Receive zwróci 0, jeśli druga strona zamknie połączenie. Rozumiem to wszystko.

Czy istnieje minimalna liczba bajtów, które należy odczytać? Powód, dla którego pytam jest z dokumentacji, wydaje się całkowicie możliwe, że cały wskaźnik długości (4 bajty) może nie być dostępny, gdy socket.Receive może zwrócić. Musielibyśmy wtedy próbować dalej. Bardziej efektywne byłoby zminimalizowanie liczby wywołań socket.receive, ponieważ musi on kopiować rzeczy do buforów i wychodzić z nich. Czy więc bezpieczniej jest uzyskać pojedynczy bajt na raz, aby uzyskać wskaźnik długości, czy można bezpiecznie założyć, że 4 bajty będą zawsze dostępne lub czy powinniśmy próbować uzyskać 4 bajty przy użyciu zmiennej przesunięcia?

Powodem, dla którego myślę, że może istnieć jakiś domyślny minimalny poziom, jest to, że natknąłem się na zmienną o nazwie ReceiveLowWater, którą mogę ustawić w opcjach gniazda. Ale wydaje się, że dotyczy to tylko BSD.MSDN Zobacz SO_RCVLOWAT.

To nie jest tak ważne, ale próbuję napisać testy jednostkowe. Mam już standardowe gniazdo .Net za interfejsem.

questionAnswers(2)

yourAnswerToTheQuestion