Я использую TCP-сокет следующим образом:
m_socket = новый сокет (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
m_socket.ReceiveTimeout = 15;
Общий процесс заключается в том, что я запускаю m_socket.Receive в бесконечном цикле while, и в какой-то момент сокет становится пустым на длительный период, но я не хочу его закрывать.
Вместо этого я хочу продолжать пытаться читать и тайм-аут с исключением каждые 15 секунд.
Что происходит, так это то, что в первый раз, когда сокет становится пустым, я получаю исключение тайм-аута сокета через 15 секунд, как и ожидалось.
Затем, поскольку я все еще в цикле, m_socket.Receive вызывается снова - однако на этот раз неблокирующая операция сокета не может быть завершена, исключение выдается (что не является тем, что я ожидаю, это предполагает блокировку еще на 15 секунд ) даже если я запрашиваю m_socket.Blocking на одну строку выше, он говорит TRUE.
Интересно то, что если я выполню m_socket.Blocking = true; как раз перед m_socket.Receive, все работает как положено (каждые 15 секунд генерируются только исключения тайм-аута).
Единственное возможное объяснение состоит в том, что исключение тайм-аута каким-то образом изменило операцию получения или операции с сокетом в целом, чтобы работать неблокирующим образом, не изменяя при этом свойство "Блокировка" соответствующим образом.