2011-10-05 6 views
7

Czy NetworkStream.Write będzie blokować tylko do momentu umieszczenia danych do wysłania w buforze wysyłania TCP, czy będzie blokować, dopóki dane nie zostaną faktycznie przesłane przez host odbierający?Jakie warunki powodują blokowanie obiektu NetworkStream.Write?

Uwaga: Gniazdo jest skonfigurowane do blokowania wejść/wyjść.

Edytuj: Oczywiście, nie ma czegoś takiego jak TcpClient.Write oczywiście! Wszyscy zrozumieliśmy, że mówimy o TcpClient.GetStream().Write, która jest faktycznie NetworkStream.Write!

Odpowiedz

7

ile .net używa czegoś innego niż Winsock, a następnie zgodnie z odniesieniem Winsock:

Pomyślne zakończenie funkcji wysyłania nie oznacza, że ​​dane zostały pomyślnie dostarczone i odebrane przez odbiorcę. Ta funkcja wskazuje tylko, że dane zostały wysłane pomyślnie.

Jeśli w systemie transportowym nie ma miejsca na bufor do przechowywania danych, które mają być przesłane, wysyłanie zostanie zablokowane, chyba że gniazdo zostało umieszczone w trybie bez blokady. W przypadku nieblokujących gniazd zorientowanych strumieniowo liczba zapisanych bajtów może wynosić od 1 do żądanej długości, w zależności od dostępności bufora zarówno na komputerze klienta, jak i na serwerze.

Zakładając, że zapis dzwoni wysłać pod spodem, to ścisła interpretacja dokumentacji Winsock wskazywałoby, że nie ma gwarancyjny, że dane dotarł do drugiego końca rurki, kiedy wraca.

Oto link do docs Winsock Cytuję z: http://msdn.microsoft.com/en-us/library/windows/desktop/ms741416(v=VS.85).aspx

+0

+1 za wyświetlenie odniesienia. Muszę jeszcze znaleźć inną dokumentację na ten temat, więc zakładam, że to, co cytujesz, jest prawdopodobnie poprawne. –

+1

+1 Dobra robota w referncji (zaskakująco trudno było znaleźć dokumenty na temat czegoś, co właśnie wzięłam za pewnik) – tcarvin

+0

(I tak, .NET używa gniazd OS, które są Winsock w systemie Windows.) –

-1

TcpClient.Write będzie blokować, dopóki bufor pakietu nie zostanie przepłukany do sieci i że odebrano odpowiednie potwierdzenia ACK. Zauważysz, że zerwane połączenie zwykle kończy się wyrzuceniem wyjątku na operację Write, ponieważ oczekuje na potwierdzenie ACK, ale nie otrzyma go w zdefiniowanym czasie oczekiwania.

1

Nie zgadzam się z obiema odpowiedziami [które wskazują, że blokuje]. Pisanie do gniazda TCP/IP nie blokuje, chyba że bufor bazowy jest już pełen niepotwierdzonych danych. Zasadniczo nie blokuje, ale po prostu zostaje przekazana do implementacji TCP. Ale oczywiście teraz muszę iść wyśledzić niektóre odniesienia ten fakt :)

Od SO

+0

I wydają się być widząc swoją odpowiedź będzie poprawna na Mono, podczas gdy inne odpowiedzi wydają się być poprawne w systemie Windows. Jestem bardzo zdezorientowany. Mam nadzieję, że znajdziesz odniesienia, ponieważ nie mogę znaleźć niczego rozstrzygającego. –