Экземпляр TcpClient, созданный методом Accept, используется для управления клиентским подключением.Проблема возникает, когда мне нужно прервать поток сервера, так как он блокируется при получении вызова.
Поэтому я настраиваю TcpClient ReceiveTimeout для выполнения цикла каждые n миллисекунд для проверкиусловие выхода.В результате операция Receive вызывает исключение (SocketException), имеющее код ошибки SocketError.TimedOut.Хорошо, я думал ...
Проблема в том, что свойство Socket.Connected возвращает значение false, но, как указано в документации MSDN:
Значениесвойства Connected отражает состояние соединения на момент последней операции.Если вам необходимо определить текущее состояние соединения, выполните неблокирующий нулевой байт.Если вызов успешно возвращается или выдает код ошибки WAEWOULDBLOCK (10035), то сокет все еще подключен;в противном случае сокет больше не подключен.
Итак, я делаю то, что заявляет:
try {
// Receive operation on socket stream
// Send operation on socket stream
} catch (SocketException e) {
if (e.SocketErrorCode == SocketError.TimedOut) {
try {
IAsyncResult asyncResult;
int sResult;
asyncResult = mSocket.Client.BeginSend(new byte[] {}, 0, 0, SocketFlags.None, delegate(IAsyncResult result) { }, null);
sResult = mSocket.Client.EndSend(asyncResult);
Debug.Assert(asyncResult.IsCompleted == true);
if (mSocket.Connected == false)
throw new Exception("not more connected"); // Always thrown
} catch (Exception e) {
// ...
}
}
Но, даже если выполняется операция отправки aynch, свойство mSocket.Connected всегда ложно, вызывая завершение внешнего цикла (другие потоки вызывают метод Disconnect для завершения потока сервера).
Чего мне не хватает?