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

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

Спасибо.

EDIT Был предложен опрос клиента. Доступно, но это не решает проблему. Если клиент не «подключен», он просто возвращает 0.

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

Ответы [ 4 ]

6 голосов
/ 19 сентября 2008

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

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

1 голос
/ 24 сентября 2010

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

  if (client.Client.Poll(0, SelectMode.SelectRead))
                    {
                        byte[] checkConn = new byte[1];
                        if (client.Client.Receive(checkConn, SocketFlags.Peek) == 0)
                        {
                            throw new IOException();
                        }
                    }
0 голосов
/ 03 февраля 2019

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
0 голосов
/ 19 сентября 2008

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

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

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