2008-09-19 1 views
4

나는 데이터의 문자열을 검색하여 TcpClient를 사용하고 있습니다. 나는 끊임없이 .Connected 속성을 검사하여 클라이언트가 연결되어 있는지 확인하지만 클라이언트가 연결을 끊어도 여전히 true를 반환합니다. 이 문제를 해결하기 위해 무엇을 사용할 수 있습니까? TcpClient.Connected는 true를 반환하지만 클라이언트가 연결되어 있지 않습니다. 대신 사용할 수있는 것은 무엇입니까? VB.net에서

내 현재 코드의 버전을 박탈입니다 :

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 

클라이언트 연결을 해제하는 경우 I 예외를 슬로우 적어도 GetStream() 호출을 낸 것입니다하지만 난 다른 응용 프로그램을 닫은 그리고 그것은 여전히 ​​

감사합니다 ...하지 않습니다.

수정 클라이언트 폴링이 제안되었지만 문제를 해결하지 못했습니다. 클라이언트가없는 경우 'acutally'가능한 연결 단지의 핵심은 내가 연결이 영업을 할 수 있도록 나를 같은 소켓 연결을 통해 데이터를 여러 번받을 수 있도록하기 위해 노력하고 있다는 것입니다 0

를 반환합니다.

답변

6

도움이 경우, 다음 연결이 닫혔습니다. Reference :

읽을 수있는 데이터가 없으면 데이터를 사용할 수있을 때까지 NetworkStream.Read 메서드가 차단됩니다. 블로킹을 방지하기 위해 DataAvailable 속성을 사용하여 데이터가 들어오는 네트워크 버퍼에 대기 중인지 여부를 확인할 수 있습니다. DataAvailable이 true를 반환하면 읽기 작업이 즉시 완료됩니다. 읽기 작업은 size 매개 변수로 지정된 바이트 수까지 가능한 많은 데이터를 읽습니다. 원격 호스트가 연결을 종료하고 사용 가능한 모든 데이터를받은 경우 Read 메서드는 즉시 완료되고 0 바이트를 반환합니다.

0

폴링 client.connected 대신에, 어쩌면 더 이상 사용 가능한 데이터가 없습니다 있는지 확인하기는 NetworkStream의 속성을 사용할 수 있습니까?

어쨌든, 청취자와 이것 저것에 대한 정보의 톤을 가진 ONDotnet.com 기사가있다. NetworkStream.Read가 0을 반환하면 ... 당신이 당신의 문제가 과거를 얻을

1

더 나은 답 : 이것은 나를 위해 일한

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

, 감사합니다! – SeeCoolGuy

+0

이것은 정말로 오래되었지만 귀하의 답변이 무엇을하고 있는지 모르기 때문에 코드에 주석을 달거나 설명을해야합니다. –

관련 문제