Wenn ich Daten von einer NetworkStream
empfange, kann ich die stream.ReadTimeout
konfigurieren.
Wenn innerhalb der konfigurierten Zeit keine Daten empfangen wurden, erhalte ich eine SocketException
mit ex.SocketErrorCode=SocketError.TimedOut
.Kann ich einen NetworkStream nach einer Ausnahme wegen eines Timeouts weiterhin verwenden?
Kann ich den Stream nach dieser Ausnahme weiterhin verwenden oder besteht die Möglichkeit, dass einige Bytes auf diese Weise verloren gehen?
Beispielcode:
using (TcpClient client = new TcpClient("127.0.0.1", 2000))
using (NetworkStream stream = client.GetStream())
using (StreamReader reader = new StreamReader(stream, Encoding.ASCII))
{
stream.ReadTimeout = 5000;
while (true)
{
int i;
try
{
i = reader.Read();
}
catch (IOException ex)
{
SocketError socketError = SocketError.Success;
if (ex.InnerException is SocketException)
socketError = ((SocketException)ex.InnerException).SocketErrorCode;
if (socketError == SocketError.TimedOut)
{
Console.WriteLine("no data received for 5 seconds");
continue;
}
else throw;
}
}
}
[Klicken Sie auf] (https://Stackoverflow.com/a/3575154/1997232). – Sinatr
@Sinatr Ich glaube nicht, dass die Antwort, die du verlinkt hast, korrekt ist. Der TcpClient wird in meinen Tests überhaupt nicht getrennt, es funktioniert einwandfrei. Ich weiß nur nicht, ob dieser Ansatz sicher ist oder ob Bytes möglicherweise verloren gehen könnten. – HugoRune