2010-03-29 4 views
5

Piszę niestandardowy serwer TCP i klienta i wykonuję tonę żądań (dokładnie 60 000). Zaczynam dostaję ten błąd gniazda 10048, który should mean "adres jest już w użyciu."Błędy gniazd 10048 na kliencie? Możliwe przyczyny?

Błąd nadal się dzieje, chyba że wstrzymam proces na około 2 lub 3 minuty, a następnie rozpocząć go ponownie, a następnie zaczyna wywoływać ten sam błąd krótko po ponownym uruchomieniu. Jeśli wstrzymam proces klienta i zrestartuję proces serwera, nadal otrzymuję ten sam błąd na kliencie. Jest to więc kompletny problem po stronie klienta.

To nie ma sensu, ale ten błąd występuje zwykle tylko podczas wiązania i ten błąd występuje na kliencie, a nie na serwerze. Jakie mogą być tego przyczyny?

Niewielki fragment mojego inicjalizacji:

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

Ponadto, wszystko wydaje się być w porządku pracy (w tym czas potrzebny do wysłania tam iz powrotem) i działa to doskonale podczas korzystania 127.0.0.1 ale kiedy umieszczając go na innym komputerze LAN, zaczynam dostrzegać błąd 10048.

Czy jest coś nie tak z tym, jak go zainicjować? Co jeszcze może spowodować ten błąd po stronie klienta?

Odpowiedz

9

Zobacz http://msdn.microsoft.com/en-us/library/e160993d%28v=VS.90%29.aspx SetSocketOption. Potrzebujesz DontLinger lub ReuseAddr, lub obu, nie jestem pewien. Zasadniczo twoje gniazda tkwią w stanie TIME_WAIT przez pewien czas po oderwaniu połączenia TCP, gdy tylko uzyskasz ich wystarczająco dużo, nie będziesz w stanie tworzyć nowych połączeń z klientami. Sprawdź to za pomocą wyjścia programu netstat -na.

Można również skrócić czas gniazdo pozostaje w stanie CZAS_OCZEKIWANIA zmieniając go w rejestrze : http://msdn.microsoft.com/en-us/library/aa560610%28BTS.20%29.aspx domyślna wynosi 4 minuty, które prawdopodobnie mogą być zredukowane do 1 lub 2 minuty bezpieczny, zwłaszcza do testów.

Nota prawna: Nie jestem guru TCP w żaden sposób.

+0

dodałem 'client.LingerState = new LingerOption (false, 0);' a używając netstat, po prawej stronie, mam obciążenie tragiczne połączeń w CZAS_OCZEKIWANIA – Earlz

+0

Mam na myśli, wciąż mam dużo TIME_WAIT po dodaniu 'LingerState' bit – Earlz

+0

ReuseAddr również nie pomaga. – Earlz

0
+0

Jeśli to jest powód, to jak to działa dobrze, gdy używam localhost? – Earlz

+1

@Ellz: Możliwe, że połączenia w wersji 127.0.0.1 używają bardzo niskiego (0?) Czasu życia segmentu, ponieważ nie możemy uzyskać pakietów wędrownych. Nie udało mi się znaleźć niczego na ten temat przez szukanie w Google, ale miałoby to sens. Możesz spróbować użyć interfejsu IP i sprawdzić, czy powoduje to jego powtarzalność na komputerze lokalnym - choć może to być również zoptymalizowane. Zapoznaj się również z ustawieniem TcpTimedWaitDelay na 30 sekund (http://msdn.microsoft.com/en-us/library/ms819739.aspx) na serwerze, jeśli jest to możliwe –