Ich würde gerne auf eine langsame Antwort von einem Client mit TcpClient
warten, aber eine Zeitüberschreitung nach etwa 20s, egal wie ich es konfiguriere. Dies ist mein Versuch:TcpClient SocketException mit Timeout nach 20s egal
using (var client = new TcpClient { ReceiveTimeout = 9999999, SendTimeout = 9999999 })
{
await client.ConnectAsync(ip, port);
using (var stream = client.GetStream())
{
// Some quick read/writes happen here via the stream with stream.Write() and stream.Read(), successfully.
// Now the remote host is calculating something long and will reply if finished. This throws the below exception however instead of waiting for >20s.
var bytesRead = await stream.ReadAsync(new byte[8], 0, 8);
}
}
Die Ausnahme ist ein IOException
:
Daten können nicht von der Transportverbindung lesen: Eine Verbindung Versuch schlug fehl, da die verbundene Partei nicht richtig nach einer Zeit ansprachen der Zeit, oder eine bestehende Verbindung fehlgeschlagen, weil verbundenen Host konnte nicht antworten.
..., die ein SocketException
innen enthält:
Ein Verbindungsversuch ist fehlgeschlagen, da die verbundene Partei nach einer gewissen Zeit nicht richtig reagiert hat, oder die hergestellte Verbindung schlug fehl, da der verbundene Host ausgefallen ist zu antworten
SocketErrorCode
ist TimedOut
.
Die 20s seems to be an OS default on Windows aber ist es nicht möglich, es von verwaltetem Code durch Interaktion mit TcpClient
zu überschreiben? Oder wie kann ich sonst auf die Antwort warten?
Ich habe auch die alte Art BeginRead
- Weg versucht und das gleiche passiert auf EndRead
. Das Problem wird auch nicht von Windows-Firewall oder Defender verursacht.
Update: wenn ich versuche, ReadAsync() erneut auszuführen, nachdem es einmal fehlschlägt, bekomme ich "Eine bestehende Verbindung wurde zwangsweise vom Remote-Host geschlossen". Es ist mein Verdacht, dass der Remote-Host das ganze Problem verursacht, aber schon vorher konnte ich kein Anzeichen dafür finden, dass es die Verbindung schließen würde. – Piedone