#c# #sockets #stopwatch #networkstream
#c# #сокеты #секундомер #networkstream
Вопрос:
Я использую System.Net.Sockets.NetworkStream
для обмена данными со своим серверным приложением. Инициализация:
var socket = new Socket(System.Net.Sockets.AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
socket.IOControl(IOControlCode.KeepAliveValues, keepAliveBytes, null); //where bytes are calculated based on OnOff = 1, KeepAliveTime = 120000,KeepAliveInterval = 10000
socket.Connect(server_endpoint);
socket.NoDelay = true;
socket.ReceiveBufferSize = /*65kb*/;
socket.SendBufferSize = /*65kb*/;
var stream = new NetworkStream(socket, true);
stream.ReadTimeout = 750; // I expect triggering exception each time when this value is exceeded
// Configure 1000 ms delay on the server side
stream.ReadBytes(messageSizeBytes, 0, 4, cancellationToken); // I expect IOException here since the ReadTimeout is 750 but the server delay was 1000
Но иногда этого не происходит. Я проверил с помощью stopwatch
:
Stopwatch stop = Stopwatch.StartNew();
_stream.ReadBytes(messageSizeBytes, 0, 4, cancellationToken);
stop.Stop();
что сервер запускает требуемую задержку. Я видел этот результат:
1. The whole stream.ReadBytes duration => 1001.8625
2. The configured ReadTimeout in this line => 750
3. The exceeded time (without exception) => 1001.8625 - 750 = 251.8625
Итак, мой вопрос в том, ожидается ли это или нет. Если это не так, почему может существовать такая ситуация?
Комментарии:
1. кроме того, если это ожидается, может быть, это где-то задокументировано?
2. Что произойдет, если вы установите его равным 2000 мс? Что происходит, когда вы устанавливаете его на 20 мс? Что произойдет, если вы запустите его 100 раз со скоростью 750 мс? На какое среднее значение он отключен?
3. При вызове
ReadTimeout
фреймворк вызывает socket APIsetsockopt
с опциейSO_RCVTIMEO
. Может быть, вы могли бы исследовать, что может происходить.