Несовместимость свойств блокирующего сокета C # TCP - PullRequest
1 голос
/ 11 августа 2010

Я использую 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 секунд генерируются только исключения тайм-аута).

Единственное возможное объяснение состоит в том, что исключение тайм-аута каким-то образом изменило операцию получения или операции с сокетом в целом, чтобы работать неблокирующим образом, не изменяя при этом свойство "Блокировка" соответствующим образом.

Ответы [ 3 ]

1 голос
/ 12 августа 2010

Я нашел это

Судя по всему, в этой проблеме была исправлена ​​ошибка, исправленная в .NET 4.0

0 голосов
/ 12 февраля 2014

ReceiveTimeout указывается в миллисекундах.Вы должны установить 15000, чтобы это заработало.Посмотрите на http://msdn.microsoft.com/en-us/library/system.net.sockets.tcpclient.receivetimeout%28v=vs.110%29.aspx

0 голосов
/ 11 августа 2010

Вы блокируете другой вызов функции winsock в том же потоке?

из msdn :

Примечание При выдаче блокировки Вызов Winsock, такой как send, recv, выбрать, принять или подключить функцию звонки, Winsock, возможно, придется ждать сетевое событие до вызова может полный. Winsock выполняет бдительное ожидание в этой ситуации, который может быть прерван вызов асинхронной процедуры (APC) запланировано в той же теме, и тем самым создать неопределенные результаты. Делать не выпускается блокирующая функция Winsock звонки, не будучи уверенным, что текущий поток не ждет внутри другая блокирующая функция Winsock вызов; это приводит к непредсказуемое поведение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...