2010-03-28 13 views
5

Piszemy program TCPServer i Client. Ile jest miejsca w buforze TcpClient? Na przykład, kiedy zacznie wyrzucać dane? Próbujemy ustalić, czy TcpClient może blokować lub czy powinien przejść do własnego wątku tła (tak, aby bufor nie mógł się zapełnić).Ile buforów ma NetworkStream i TcpClient?

Odpowiedz

6

Można uzyskać rozmiary buforów od TcpClient.ReceiveBufferSize i TcpClient.SendBufferSize.

Dostępne rozmiary buforów będą się różnić w zależności od tego, czy dane zostaną odebrane/potwierdzone (czy nie) na poziomie TCP. TcpClient jest domyślnie blokowany.

Żadne dane nie zostaną wyrzucone w wyniku pełnych buforów, choć dane mogą być wyrzucić w warunkach błędów (takich jak peer znika/Błędy/wyjścia etc.)

+0

Cóż, więc będzie nadal otrzymywać dane, aż do wyczerpania pamięci komputera? – Earlz

+3

Nie, protokół TCP zapewnia kontrolę przepływu. Gdy bufory są pełne, drugi koniec przestaje wysyłać. – nos

+0

Zajmuję się również serwerem, więc jeśli tak się stanie, to co stanie się na serwerze? Kiedy będą bufory wypełniać również przy użyciu 'TcpServer' – Earlz

3

dokumentacji MSDN mówi domyślny rozmiar buforów send i receive dla TcpClient wynosi 8192 bajtów lub 8 KB. Dokumentacja nie określa limitu wielkości buforów.

Jestem pewien, że wiesz, że wysyłasz i odbierasz dane za pośrednictwem TcpClient, używając ich bazowego obiektu NetworkStream. Masz kontrolę nad tym, czy są to operacje synchroniczne czy asynchroniczne. Jeśli chcesz zachować synchroniczne działanie, użyj metod Read i Write z NetworkStream. Jeśli chcesz zachowanie asynchroniczne, użyj operacji BeginRead/ i.

Jeśli otrzymujesz dane jako część aplikacji front-end, zdecydowanie zaleca się to w wątku dodatkowym, niezależnie od tego, czy robisz to za pomocą metod asynchronicznych, czy synchronicznie w osobnym wątku. Umożliwi to Twojemu interfejsowi reagowanie na użytkownika, nadal obsługując wysyłanie i odbieranie danych w tle.

+0

Cóż, nie jesteśmy pewien, czy chcemy asynchronicznego, czy po prostu zrobić to synchronicznie w wątku tła – Earlz

+0

@ Earlz, nie jestem pewien, czy istnieje ogromna różnica między tymi dwoma. Metody asynchroniczne, np. 'BeginRead(), wykonują swoje odpowiednie metody' AsyncCallback' w osobnym wątku. Pod koniec dnia musisz użyć dodatkowego wątku, jeśli próbujesz wysyłać/odbierać dane podczas przetwarzania danych wprowadzanych przez użytkownika z interfejsu użytkownika. –

+1

@MattDavis, to powszechne nieporozumienie. Metody .NET Async faktycznie wykorzystują porty wejścia/wyjścia dla wywołania funkcji systemu operacyjnego, więc żadne wątki nie są blokowane lub są używane podczas oczekiwania na wejścia/wyjścia w gnieździe, systemie plików lub nazwanej potoku lub cokolwiek. –

Powiązane problemy