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

c# .net vb.net sockets

8623 просмотра

4 ответа

В 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 () вызовет исключение, если клиент был отключен, но я закрыл другое приложение, а оно все еще не ...

Благодарю.

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

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

Автор: Dilbert789 Источник Размещён: 17.05.2019 03:14

Ответы (4)


6 плюса

Решение

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

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

Автор: Mark Brackett Размещён: 19.09.2008 03:04

1 плюс

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

  if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];
                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }
Автор: Sean P Размещён: 23.09.2010 10:41

0 плюса

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

LINK = https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.socket.poll?view=netframework-4.0

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

Dim TC As New TimerCallback (AddressOf Ping)

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

Sub Ping()
    Send("Stil here?")
End Sub
Автор: MJ- Размещён: 02.02.2019 09:22

-1 плюса

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

Во всяком случае, есть статья на ONDotnet.com с тоннами информации о слушателях и еще много чего. Должно помочь вам пройти вашу проблему ...

Автор: Kevin Fairchild Размещён: 19.09.2008 01:22
Вопросы из категории :
32x32