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를 반환하면 읽기 작업이 즉시 완료됩니다.읽기 작업은 size 매개변수에 지정된 바이트 수까지 사용 가능한 만큼의 데이터를 읽습니다. 원격 호스트가 연결을 종료하고 사용 가능한 모든 데이터를 수신한 경우 Read 메서드는 즉시 완료되고 0바이트를 반환합니다.

다른 팁

더 나은 답변:

  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

때때로 메시지를 다른 소켓으로 보내는 타이머를 설정해야 합니다.

새로운 TimerCallback(Ping 주소)으로 TC를 희미하게 합니다.

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