Gdy klient próbuje połączyć się z rozłączonym adresem IP, upływa długi czas ponad 15 sekund ... Jak możemy skrócić ten limit czasu? Jaka jest metoda konfiguracji?
Kod, którego używam do konfigurowania połączenia z gniazdem, jest następujący:
try
{
m_clientSocket = new Socket(
AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
IPAddress ip = IPAddress.Parse(serverIp);
int iPortNo = System.Convert.ToInt16(serverPort);
IPEndPoint ipEnd = new IPEndPoint(ip, iPortNo);
m_clientSocket.Connect(ipEnd);
if (m_clientSocket.Connected)
{
lb_connectStatus.Text = "Connection Established";
WaitForServerData();
}
}
catch (SocketException se)
{
lb_connectStatus.Text = "Connection Failed";
MessageBox.Show(se.Message);
}
null
w dlacallback
i planujeszEndConnect()
, jeśli gniazdo jestclosed
wtedy to daje wyjątek. Więc upewnij się, że sprawdziłeś ...AsyncWaitHandle.WaitOne
zostanie to zasygnalizowane, ale gniazdo pozostanie niepodłączone.Moje podanie:
źródło
SocketExtension
, nadal nie.Connected
sprawdzałeś, czy tak jest i nie używaszsocket.Connected = true;
do definiowaniasuccess
.Właśnie napisałem klasę rozszerzenia, aby umożliwić przekroczenie limitu czasu połączeń. Użyj go dokładnie tak, jak używałbyś standardowych
Connect()
metod, z dodatkowym parametrem o nazwietimeout
.źródło
socket.EndConnect
Trwa ~ 10 sekund, aby zamknąć tak nie wróci funkcyjnych po okresie czasu, ale po horyzont czasowy + endConnect czasuNie programuję w C #, ale w C rozwiązujemy ten sam problem, ustawiając gniazdo jako nieblokujące, a następnie umieszczając fd w pętli select / poll z wartością timeout równą ilości czasu, przez jaki jesteśmy gotowi czekać na połączenie odnieść sukces.
Znalazłem to dla Visual C ++ i wyjaśnienie tam również pochyla się w kierunku mechanizmu select / poll, który wyjaśniłem wcześniej.
Z mojego doświadczenia wynika, że nie można zmienić wartości limitu czasu połączenia dla każdego gniazda. Możesz to zmienić dla wszystkich (przez dostrojenie parametrów systemu operacyjnego).
źródło
może być za późno, ale jest zgrabne rozwiązanie oparte na Task.WaitAny (c # 5 +):
źródło
Rozwiązałem problem, używając metody Socket.ConnectAsync zamiast metody Socket.Connect. Po wywołaniu Socket.ConnectAsync (SocketAsyncEventArgs), uruchom licznik czasu (timer_connection), jeśli czas się skończył, sprawdź, czy połączenie gniazda jest połączone (jeśli (m_clientSocket.Connected)), jeśli nie, wyskakuje błąd limitu czasu.
źródło
Sprawdź to w MSDN . Nie wydaje się, że można to zrobić za pomocą zaimplementowanych właściwości w klasie Socket.
Plakat na MSDN faktycznie rozwiązał jego problem przy użyciu wątków. Miał główny wątek, który wywoływał inne wątki, które uruchamiają kod połączenia na kilka sekund, a następnie sprawdzają właściwość Connected gniazda:
Co próbujesz zrobić i dlaczego nie może czekać 15-30 sekund, zanim upłynie limit czasu?
źródło
Miałem ten sam problem podczas łączenia się z gniazdem i wpadłem na poniższe rozwiązanie, działa dobrze dla mnie. `
źródło
Pracowałem z Unity i miałem problem z BeginConnect i innymi metodami asynchronicznymi z gniazda.
Jest coś, czego nie rozumiem, ale przykłady kodu wcześniej nie działają.
Więc napisałem ten fragment kodu, aby działał. Testuję to w sieci adhoc z Androidem i komputerem, również lokalnie na moim komputerze. Mam nadzieję, że to pomoże.
i istnieje bardzo prosty watchdog w C #, aby to działało:
źródło
To jest jak odpowiedź FlappySock, ale dodałem do niej wywołanie zwrotne, ponieważ nie podobał mi się układ i sposób zwracania wartości logicznej. W komentarzach do tej odpowiedzi Nicka Millera:
Więc wydaje mi się, że poleganie na tym, co zostanie zwrócone, może być niebezpieczne - wolę używać
socket.Connected
. Ustawiam wartość logiczną dopuszczającą wartość null i aktualizuję ją w funkcji wywołania zwrotnego. Zauważyłem też, że nie zawsze kończy raportowanie wyniku przed powrotem do funkcji głównej - radzę sobie z tym i czekam na wynik używając limitu czasu:Powiązane: Jak sprawdzić, czy mam połączenie?
źródło
W klasie Socket powinna znajdować się właściwość ReceiveTimeout.
Właściwość Socket.ReceiveTimeout
źródło
ReceiveTimeout
- dotyczy to wyłącznie odbioru zBeginReceive
iEndReceive
. Nie ma odpowiednika, gdy po prostu widzisz, czy masz połączenie.