1

C# 서버 및 클라이언트을 작성하고 있지만 클라이언트 연결이 끊어 지더라도 예외가 발생하지 않습니다. 그것은 클라이언트가 여전히 거기에 있다고 생각하면서 클라이언트로부터 계속해서 읽습니다. 클라이언트가 없어지더라도 더 이상 차단하지 않습니다. 클라이언트가 더 이상 사용할 수 없으면 예외가 throw 될 것으로 예상됩니다.C# NetworkStream 예외가 발생하지 않음

private TcpListener server; 
private NetworkStream stream; 
private TcpClient client; 
private byte[] buffer = new byte[1]; 

server = new TcpListener (serverIp, _portNumber); 
server.Start(); 

stream = client.GetStream(); 

// 클라이언트가 없어 졌을 때 예외를 던지기를 원하는 부분.

try 
{ 
    stream.Read(buffer,0,1); 
} 
catch(Exception e) 
{ 
    #if (DEBUG) 
    Debug.Log ("Failed Rading " + e.Message); 
    #endif 
    return 0; 
} 

어떤 도움을 주시면 감사하겠습니다.

답변

0

을 시간 초과를 제외하고는 할 수 있습니다. 서버는 클라이언트가 없어 졌음을 알 수있는 방법이 없습니다.

당신은이 사실과 함께 살아야합니다. 제한 시간을 설정하십시오.

+0

몇시에 시간 제한을 설정해야합니까? – Programmer

+0

위양성과 위양성의 절충안을 선택하십시오. 네트워크 및 드롭 된 연결을 감지하는 속도에 따라 다릅니다. 합리적인 값은 대부분의 경우 [1, 30] 초입니다. 또한 모든 경우에 실패한 연결을 감지 할 수있는 다른 방법이 없음을 이해하십시오. 타임 아웃 만이 유일한 해결책입니다. – usr

+0

코드 스 니펫을 게시 하시겠습니까? TcpClient 및 NetworkStream 클래스에는 모두 시간 초과 기능이 있습니다. 어떤 것들을 설정해야합니까? – Programmer

0

연결이 닫히고 읽을 버퍼가 더 이상 없을 때 예외가 발생합니다. 분명히 여전히 유효한 데이터가 있습니다. 버퍼와 연결이 닫히면 예외가 발생합니다. 또한 그 시간에 1 바이트의 데이터를 읽는 것을 봅니다. 연결이 살아 있다면 왜 먼저 확인하지 :

데이터 정확한 금액 읽고 읽을 수있는 경우
client.Client.Poll(0, SelectMode.SelectRead) 

검사 : 클라이언트가 서버에게 알리지 않고 사라집니다 경우 아무것도

int available = client.Client.Available; 
if(available > 0) 
{ 
    var buffer = new byte[available]; 
    client.Read(buffer, 0, available); 
} 
+0

(server.Client.Availabe)가 멋지지만 Client.Available 부분이 어디에도 정의되어 있지 않은 경우. 나는 약간의 오류가있다. – Programmer

+0

사용할 수있는 값은 유용하지 않습니다. 0을 반환하면 사용 가능한 데이터가 실제로 없다는 것을 알 수 없습니다. 또한 어떤 방식 으로든 끊어진 연결을 안정적으로 확인할 수 없습니다. – usr

+0

소켓 네임 스페이스를 포함 시켰습니까? http://msdn.microsoft.com/en-us/library/system.net.sockets.socket.aspx – Taxos

관련 문제