2010-03-29 24 views
5

Özel bir TCP sunucusu ve istemcisi yazıyorum ve bir çok istekte bulunarak (60.000 tam olarak), bu soket hatasını 10048 olarak almaya başladım, bu adreste should mean "adres zaten kullanılıyor."İstemcideki 10048 soket hataları? Olası nedenler?

İşlem 2 veya 3 dakika gibi bir süre beklemeden ve sonra yeniden başlatılmadan hata devam ediyor ve yeniden başlatıldıktan hemen sonra aynı hatayı almaya başlıyor. İstemci işlemini duraklatır ve sunucu işlemini yeniden başlatırsam, istemcide hala aynı hatayı alıyorum. Yani tam bir istemci tarafı sorunudur.

Bu durum bir anlam ifade etmemektedir, ancak bu hata genellikle yalnızca bağlayıcı olduğunda ve bu hata sunucuda değil istemcide gerçekleştiğinde ortaya çıkar. Bunun olası sebepleri neler olabilir?

benim başlatma küçük bir alıntı:

TcpClient client = new TcpClient(); 
client.Connect("XXXXX -- some ip", 25000); 
client.NoDelay = true; 
NetworkStream clientStream = client.GetStream(); 

Ayrıca, diğer her şey (o ileri geri göndermek için gereken süreyi de dahil) iyi çalışıyor gibi görünüyor ve bu mükemmel çalışıyor 127.0.0.1 kullanırken ama ne zaman Başka bir LAN bilgisayara koyarak 10048 hatası almaya başladım.

Nasıl başlattığımla ilgili bir sorun var mı? İstemci tarafında bu hatayı neden başka ne olabilir?

cevap

9

Bkz. http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. DontLinger veya ReuseAddr'a ihtiyacınız var, ya da ikisinden de emin değilim. Temelde, TCP bağlantınızı yırttıktan sonra bir süreliğine TIME_WAIT durumunda yuvalarınız sıkışır, yeterli olduktan sonra yeni istemci bağlantıları oluşturamazsınız. Bunu netstat -na program çıkışı ile doğrulayın.

Ayrıca kayıt bunu değiştirerek bu soket TIME_WAIT durumunda kalır zamanı azaltmak için: http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx Standart muhtemelen özellikle test için, güvenli bir şekilde 1 veya 2 dakikaya düşürülebilir 4 dakikadır.

Yasal Uyarı: Hiçbir şekilde bir TCP gurusu değilim.

+0

ben 'eklenen client.LingerState = new LingerOption (yanlış, 0);' ve kullanan netstat, sağ, ben Time_Wait içinde bağlantılarının bir bok yüküne sahip – Earlz

+0

Yani, hala LingerState' bit – Earlz

+0

ReuseAddr ekledikten sonra çok fazla TIME_WAIT var. – Earlz

0
+0

Sebep buysa, localhost'u her kullandığımda nasıl çalışır? – Earlz

+1

@Earlz: Bunun sebebi, 127.0.0.1'deki bağlantıların gerçekten çok düşük (0?) Maksimum segment ömrünü kullanmasıdır, çünkü gerçekten gezgin paketleri alamıyoruz. Bu konuda googling ile hiçbir şey bulamadım, ama mantıklı olurdu. Bir arabirim IP'si kullanmayı ve kullanmayı deneyebilir ve bunun yerel makinede tekrar üretilip üretilemeyeceğini anlayabilirsiniz, ancak bu da optimize edilebilir. TcpTimedWaitDelay'i sunucuda 30 saniye (http://msdn.microsoft.com/en-us/library/ms819739.aspx) ayarına da bakabilirsiniz. –

İlgili konular