Я хотел бы ожидать медленного ответа от клиента с TcpClient
, но получить тайм-аут примерно через 20 секунд, независимо от того, как я его настрою. Это моя попытка:TcpClient SocketException с тайм-аутом после 20-х годов независимо от того, что
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);
}
}
Исключение является IOException
:
Невозможно прочитать данные из транспортного соединения: Попытка подключения не удалось, потому подключенная сторона не ответила после периода времени или установленное соединение не удалось, так как подключенный хост не смог ответить.
... который содержит SocketException
внутри:
Попытка подключения не удалась, поскольку подключенная сторона не должным образом реагировать после определенного периода времени, или установленное соединение не удалось, поскольку подключенный хост не удалось для ответа
SocketErrorCode
является TimedOut
.
20s seems to be an OS default on Windows, но нельзя ли переопределить его из управляемого кода, взаимодействуя с TcpClient
? Или как я могу ждать ответа в противном случае?
Я также пробовал стиль BeginRead
- EndRead
, и это происходит на EndRead
. Проблема также не вызвана брандмауэром Windows или защитником.
Обновление: если я попытаюсь запустить ReadAsync() снова после сбоя, я получу «Существующее соединение было принудительно закрыто удаленным хостом». Это мое подозрение, что удаленный хост вызывает всю эту проблему, но даже до этого я не мог найти никаких признаков того, что он закроет соединение. – Piedone