2010-03-28 24 views
5

Bir TCPServer ve İstemci programı yazıyoruz. TcpClient arabelleğinde ne kadar yer var? Gibi, hangi noktada veri atmaya başlayacak? TcpClient'in engellenip engellemeyeceğini veya kendi arka plan iş parçacığına (arabellek dolduramayacak şekilde) girmesi gerekip gerekmediğini belirlemeye çalışıyoruz.NetworkStream ve TcpClient ne kadar tampon içeriyor?

cevap

6

Ara bellek boyutları TcpClient.ReceiveBufferSize ve TcpClient.SendBufferSize'dan edinilebilir.

uygun tampon boyutları veri alındığı gibi/TCP düzeyinde kabul (veya değil) değişir. TcpClient varsayılan olarak engelleniyor.

hiçbir veri veri uzakta altındaki hata koşullarında (akran vb/çöker/çıkışları kaybolur gibi)

+0

Bilgisayarın belleği bitene kadar veri almaya devam edecek mi? – Earlz

+3

Hayır, TCP akış denetimi sağlar. Tamponlar dolduğunda, diğer uç göndermeyi durdurur. – nos

+0

Sunucudan da sorumluyum, bu durumda, sunucuda ne olur? Tamponlar ne zaman 'TcpServer' – Earlz

3

MSDN belgelerine varsayılan diyor atmak olabilir ama, tam tamponların sonucunda atılacaktır TcpClient için send ve receive tamponlarının boyutu 8192 bayt veya 8K'dir. Belgeler, bu arabelleklerin ne kadar büyük olabileceği konusunda bir sınır belirtmez.

Emin olduğunuzu bildiğiniz gibi, TcpClient aracılığıyla temelindeki NetworkStream nesnesini kullanarak veri gönderip alırsınız. Bunların senkronize veya senkronize olmayan işlemler olup olmadığını kontrol edersiniz. Senkronize bir davranış istiyorsanız, NetworkStream numaralı Read ve Write yöntemlerini kullanın. Eşzamansız davranışı istiyorsanız, BeginRead/EndRead ve BeginWrite/EndWrite işlemlerini kullanın.

bazı ön uç uygulaması kapsamında veri alıyorsanız, ben çok bu ayrı bir konu asenkron yöntemleri veya eşzamanlı kullanarak yapmak ister ikincil bir iş parçacığı bunu tavsiye ederim. Bu, arka planda veri göndermeyi ve almayı sürdürürken kullanıcı arayüzünüzün kullanıcıya yanıt vermesini sağlar.

+0

asenkronize etmek istiyorsak ya da sadece arka plan iş parçacığı – Earlz

+0

@Earlz'de eşzamanlı olarak yapmak için, ikisi arasında muazzam bir fark olduğundan emin değilim. Eşzamansız yöntemler, örn., BeginRead(), kendi "AsyncCallback" yöntemlerini ayrı bir iş parçacığı üzerinde yürütür. Günün sonunda, bir kullanıcı arabiriminden kullanıcı girdisini de işlerken veri göndermeye/almaya çalışıyorsanız ikincil bir iş parçacığı kullanmanız gerekir. –

+1

@MattDavis, bu yaygın bir yanlış anlama. .Net Async I/O yöntemleri aslında bir işletim sistemi özelliği çağrı G/Ç Tamamlama Bağlantı Noktalarından yararlanır, böylece hiçbir soket engellenir veya G/Ç için bir yuvada veya dosya sisteminden veya adlandırılmış bir borudan beklenirken kullanılmaz her neyse. –