У меня есть System.Net.Sockets.Socket
, который сконструирован так:
ClientSocket = new Socket(AddressFamily.InterNetwork,
SocketType.Stream,
ProtocolType.Tcp);
Позже я прочел из нее то, что считаю синхронным:
bytesReceived = ClientSocket.Receive(aBuffer, aOffset, aSize, SocketFlags.None);
Это отлично подойдет для многих тысяч звонков. Затем, в какой-то момент по причинам, которые я не понимаю, я получу исключение SocketException со следующими деталями:
SocketErrorCode - IOPending
Код ошибки - 996
hresult: -2147467259 (0x80004005)
Сообщение: выполняется операция ввода-вывода с перекрытием
Пытаясь узнать больше о перекрывающемся вводе / выводе, я вижу, что на него ссылаются главным образом асинхронные сетевые операции. Я считаю, что я использую синхронную / блокирующую версию Receive
, поэтому мне неясно, почему это исключение будет ссылаться на Overlapped IO.
Любой совет? Это исключение происходит очень редко, поэтому сбор новых данных каждый раз, когда это происходит, может занять дни или недели. Я надеюсь, что есть кое-что, что я упускаю или неправильно понимаю, что может привести к более правильному подходу.
Как и сейчас, я работаю, чтобы обнаружить эту неожиданную ошибку и повторить Receive
, когда это произойдет.
Чтобы ответить на несколько вопросов ниже:
- Все вызовы
Receive
обрабатываются в том же потоке , но это поток, отличный от потока, создавшего Socket. Сокет создается в конструкторе, а затем запускается длительно выполняемая задача для многократного вызова Receive
.
- У меня нет размеров, которые использовались, когда произошел этот сбой.