2013-05-27 4 views
0

TcpClient를 사용하고 있습니다. I에 유래 공헌 정보에 의해 해결하려고NetStream TcpClinet 전송 연결에서 데이터를 읽을 수 없습니다.

Unable to read data from the transport connection: An existing connection was forcibly closed by the remote host. at System.Net.Sockets.NetworkStream.Read(Byte[] buffer, Int32 offset, Int32 size)

: 때때로 오류가 발생합니다. 조건을 추가합니다.

netStream.CanRead

성공했지만 성공하지 못했습니다. 내가 뭘 잘못하고 있니? 여기 코드의 일부입니다. 감사합니다.

try 
     { 
      if (netStream.CanRead) 
      { 
       do 
       { 
        int bytesRead = netStream.Read(bytes, 0, bytes.Length); 
        bytesReaded += bytesRead; 
        if (bytesRead > 0) 
        { 
         byte[] toList = new byte[bytesRead]; 
         Array.Copy(bytes, toList, bytesRead); 
         listBytes.AddRange(toList); 
        } 
       } 
       while (netStream.DataAvailable); 

       if (listBytes.Count > 0) 
        ParseAllBytes(); 
      } 
      else 
      {      
       Close(); 
      } 
     } 
     catch (IOException ex) 
     { 

답변

0

Windows 방화벽에 문제가 있습니다. 방화벽이 완벽하게 작동하지 않는 경우. 방화벽이 켜져 있고 inbouds 및 outbounds에 규칙을 추가 한 경우이 예외가 발생합니다. 맨 위를 참조하십시오.

0

내 경험에 비추어 볼 때이 예외는 연결하는 동안 연결을 닫을 때 발생합니다. 인터넷을 통해 연결되는 경우 연결을 끊을 수있는 많은 홉이 있습니다. 이것이 일어나지 않아야한다고 확신한다면 (아마도 양측 모두 인프라에있다) wireshark 추적을 실행하는 것이 좋습니다. 연결이 닫히고 닫히는 경우 연결이 닫히는 것을 쉽게 볼 수 있습니다. 핀 플래그가 1로 설정된 tcp 패킷을 찾으십시오.

+0

wireshark를 사용하기 어려울 것이므로이 오류는 정기 간행물이 아닙니다. 이 문제는 연결을 끊은 후에 클라이언트가 TcpClient에 다시 연결할 수 없음을 나타냅니다. 서비스를 다시 시작해야합니다. 이 문제는 오류와 관련이 있습니까? – Musketyr

+0

재사용 소켓을 올바르게 설정하지 않으면 소켓 또는 TcpClient를 다시 만들어야 할 수도 있습니다. 나는 그것을 결코 작동시키지 못했다. 나는 항상 새로운 소켓을 만듭니다. TcpClient에 소켓과 동일한 재사용 아이디어가 있는지 확실하지 않습니다. – uriDium

+0

처리중인 데이터 처리는 TcpClient의 새 인스턴스에있는 새 스레드의 모든 클라이언트에 대한 것입니다. 오류가 발생하면 TcpClient 및 NetStream이 제대로 처리됩니다. – Musketyr

관련 문제