Wenn der Client versucht, eine Verbindung zu einer nicht verbundenen IP-Adresse herzustellen, tritt eine lange Zeitüberschreitung von mehr als 15 Sekunden auf. Wie können wir diese Zeitüberschreitung verringern? Wie kann ich es konfigurieren?
Der Code, den ich zum Einrichten einer Socket-Verbindung verwende, lautet wie folgt:
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
in für diecallback
und Sie planenEndConnect()
, wenn der Sockel wurdeclosed
dann dies wird Ihnen eine Ausnahme. Also stellen Sie sicher, dass Sie überprüfen ...AsyncWaitHandle.WaitOne
wird signalisiert , ob der Endpunkt erreicht werden kann, aber auf dem Endpunkt kein Server vorhanden ist, der die Verbindung empfangen kann, aber der Socket bleibt nicht verbunden.Meine Einstellung:
quelle
SocketExtension
, haben Sie immer noch nicht.Connected
gesehen, ob Sie es sind, und Sie verwenden sie nichtsocket.Connected = true;
zum Definierensuccess
.Ich habe gerade eine Erweiterungsklasse geschrieben, um Zeitüberschreitungen in Verbindungen zuzulassen. Verwenden Sie es genau so, wie Sie es mit den Standardmethoden
Connect()
tun würden, mit einem zusätzlichen Parameter namenstimeout
.quelle
socket.EndConnect
Schließen dauert ~ 10 Sekunden, sodass die Funktion nicht nach der Zeitspanne, sondern nach der Zeitspanne + der EndConnect-Zeit zurückkehrtIch programmiere nicht in C #, aber in C lösen wir das gleiche Problem, indem wir den Socket nicht blockieren und dann den fd in eine Select / Poll-Schleife mit einem Timeout-Wert setzen, der der Zeit entspricht, die wir bereit sind, auf die Verbindung zu warten erfolgreich sein.
Ich fand diese für Visual C ++ gefunden und die Erklärung dort geht auch in Richtung des zuvor erläuterten Auswahl- / Abfragemechanismus.
Nach meiner Erfahrung können Sie die Werte für das Verbindungszeitlimit pro Socket nicht ändern. Sie ändern es für alle (durch Einstellen der Betriebssystemparameter).
quelle
Es ist vielleicht zu spät, aber es gibt eine gute Lösung, die auf Task.WaitAny basiert (c # 5 +):
quelle
Ich habe das Problem mithilfe der Socket.ConnectAsync-Methode anstelle der Socket.Connect-Methode gelöst. Starten Sie nach dem Aufrufen von Socket.ConnectAsync (SocketAsyncEventArgs) einen Timer (timer_connection). Wenn die Zeit abgelaufen ist, überprüfen Sie, ob eine Socket-Verbindung hergestellt ist (falls (m_clientSocket.Connected)), falls nicht, Popup-Timeout-Fehler.
quelle
Überprüfen Sie dies auf MSDN . Es scheint nicht, dass Sie dies mit den implementierten Eigenschaften in der Socket-Klasse tun können.
Das Poster auf MSDN hat sein Problem tatsächlich durch Threading gelöst . Er hatte einen Haupt-Thread, der andere Threads aufrief, die den Verbindungscode einige Sekunden lang ausführten und dann die Connected-Eigenschaft des Sockets überprüften:
Was versuchst du zu tun und warum kann es nicht 15 bis 30 Sekunden warten, bevor das Zeitlimit überschritten wird?
quelle
Ich hatte das gleiche Problem beim Anschließen an eine Steckdose und fand die folgende Lösung: Es funktioniert gut für mich. `
quelle
Ich habe mit Unity gearbeitet und hatte ein Problem mit BeginConnect und anderen asynchronen Methoden von Socket.
Es gibt etwas, das ich nicht verstehe, aber die Codebeispiele zuvor funktionieren bei mir nicht.
Also habe ich diesen Code geschrieben, damit er funktioniert. Ich teste es in einem Ad-hoc-Netzwerk mit Android und PC, auch lokal auf meinem Computer. Hoffe es kann helfen.
und es gibt einen sehr einfachen Watchdog auf C #, damit es funktioniert:
quelle
Dies ist wie die Antwort von FlappySock, aber ich habe einen Rückruf hinzugefügt, weil mir das Layout und die Rückgabe des Booleschen Werts nicht gefallen haben. In den Kommentaren dieser Antwort von Nick Miller:
Für mich scheint es gefährlich zu sein, sich auf das zurückzugeben, was zurückgegeben wird - ich bevorzuge es zu verwenden
socket.Connected
. Ich setze einen nullbaren Booleschen Wert und aktualisiere ihn in der Rückruffunktion. Ich habe auch festgestellt, dass das Melden des Ergebnisses nicht immer abgeschlossen ist, bevor ich zur Hauptfunktion zurückkehre. Ich kümmere mich auch darum und lasse es mithilfe des Timeouts auf das Ergebnis warten:Verwandte: Wie überprüfe ich, ob ich verbunden bin?
quelle
In der Socket-Klasse sollte eine ReceiveTimeout-Eigenschaft vorhanden sein.
Socket.ReceiveTimeout-Eigenschaft
quelle
ReceiveTimeout
- dies gilt ausschließlich für den Empfang mitBeginReceive
undEndReceive
. Es gibt kein Äquivalent dafür, wenn Sie nur sehen, ob Sie verbunden sind.