TcpClient.Connected возвращает true, но клиент не подключен, что я могу использовать вместо этого?
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, тогда соединение было закрыто. Ссылка :
Автор: Mark Brackett Размещён: 19.09.2008 03:04Если данные для чтения недоступны, метод NetworkStream.Read будет блокироваться, пока данные не станут доступны. Чтобы избежать блокировки, вы можете использовать свойство DataAvailable, чтобы определить, находятся ли данные в очереди во входящем сетевом буфере для чтения. Если DataAvailable возвращает true, операция чтения завершится немедленно. Операция чтения будет читать столько данных, сколько доступно, вплоть до количества байтов, указанного параметром размера. Если удаленный хост завершает соединение и все доступные данные получены, метод Read завершится немедленно и вернет ноль байтов.
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Вопросы из категории :
- c# Преобразовать десятичную в двойную?
- c# Как рассчитать чей-то возраст в C #?
- c# Как вы сортируете словарь по значению?
- c# В чем разница между int и Integer в Java и C #?
- c# Как создать новый экземпляр объекта из Типа
- .net Действительно ли опечатанные классы действительно предлагают преимущества?
- .net Setting Objects to Null/Nothing after use in .NET
- vb.net Случайное целое число в VB.NET
- vb.net Лучший способ в asp.net заставить https для всего сайта?
- vb.net Кто-нибудь знает библиотеку для работы с парами количество / единица измерения?
- vb.net Одиночная форма Скрыть при запуске
- sockets Как я могу определить IP моего маршрутизатора / шлюза в Java?
- sockets java.net.SocketException: сброс соединения
- sockets TcpClient.Connected возвращает true, но клиент не подключен, что я могу использовать вместо этого?
- sockets В чем разница между портом и сокетом?
- sockets Why is it impossible, without attempting I/O, to detect that TCP socket was gracefully closed by peer?