TcpClient.Connected возвращает true, но клиент не подключен. Что я могу использовать вместо этого?

StackOverflow https://stackoverflow.com/questions/101708

  •  01-07-2019
  •  | 
  •  

Вопрос

В VB.net я использую TcpClient для получения строки данных.Я постоянно проверяю свойство .Connected, чтобы убедиться, что клиент подключен, но даже если клиент отключается, это все равно возвращает true.Что я могу использовать в качестве обходного пути для этого?

Это урезанная версия моего текущего кода:

Dim client as TcpClient = Nothing
client = listener.AcceptTcpClient
do while client.connected = true
   dim stream as networkStream = client.GetStream()
   dim bytes(1024) as byte
   dim numCharRead as integer = stream.Read(bytes,0,bytes.length)
   dim strRead as string = System.Text.Encoding.ASCII.GetString(bytes,0,i)
loop

Я бы предположил, что, по крайней мере, вызов GetStream() выдаст исключение, если клиент был отключен, но я закрыл другое приложение, а оно все еще не выдает...

Спасибо.

РЕДАКТИРОВАТЬ Был предложен опрос Client.Available, но это не решило проблему.Если клиент не подключен «на самом деле», он просто возвращает 0.

Ключ в том, что я пытаюсь разрешить соединению оставаться открытым и позволить мне получать данные несколько раз через одно и то же соединение сокета.

Это было полезно?

Решение

Когда NetworkStream.Read возвращает 0, соединение закрыто. Ссылка:

Если данные для чтения недоступны, метод NetworkStream.Read будет блокироваться до тех пор, пока данные не станут доступны.Чтобы избежать блокировки, вы можете использовать свойство DataAvailable, чтобы определить, поставлены ли данные в очередь во входящем сетевом буфере для чтения.Если DataAvailable возвращает true, операция чтения завершится немедленно.Операция чтения будет читать столько данных, сколько доступно, вплоть до количества байтов, указанного параметром размера. Если удаленный хост закрывает соединение и все доступные данные получены, метод Read немедленно завершится и вернет нулевые байты.

Другие советы

Лучший ответ:

  if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];
                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }

https://i.stack.imgur.com/Jb0X2.png

ССЫЛКА=https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0

Вам необходимо настроить таймер, который время от времени отправляет сообщение в другой сокет.

Dim TC как новый TimerCallback (AddressOf Ping)

Tick ​​= New Threading.Timer(TC, Nothing, 0, 30000)

Sub Ping()
    Send("Stil here?")
End Sub

Вместо опроса client.connected, возможно, использовать свойства NetworkStream, чтобы узнать, нет ли больше доступных данных?

Во всяком случае, есть ONDotnet.com статья с ТОННАМИ информации о слушателях и многом другом.Должно помочь вам решить вашу проблему...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top