2013-01-04 2 views
3

Visual Studio 2010 디버거에서 TWICE 상태를 쿼리 할 때 특히 자발적으로 연결이 끊기는 System.Net 소켓이 있습니다.System.Net 소켓에 대한 이상한 자발적인 연결 해제

_TCPConn = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 

나중에 내가 연결하고 "연결됨"속성을보기 위해 루프를 설정 :

이 같은 인스턴스입니다. . . 연결이 연결된 속성을 호출 직후

 _TCPConn.Connect(this.IPAddress, REMOTE_TCP_PORT); 

     // loop to figure out why/when we're disconnecting ... 
     int loops; 
     bool bState = false; 
     for (loops = 0; loops < 100; loops++) 
     { 
      bState = _TCPConn.Connected; 
      if (!_TCPConn.Connected) 
      { 
       break; 
      } 
      Thread.Sleep(1000); 
     } 

는 디버거에서 사실을하고 네트워크 스니퍼는 호스트와의 성공적인 연결을 보여줍니다.

그러나 디버거에서 Connected 속성을 두 번째로 검사하면 false으로 표시됩니다.

나는 루프의 모든 중단 점을 설정하지 마십시오 루프 (백초)를 통해 모든 방법을 얻을하고 Connected 속성을 떨어질 때 사실 내가 디버거 및 에서 보는 처음 인 경우 false 다음 번에. 나는 그것을하자 10 또는 15 초 중단 점에 대한 루프 경우

, 그것은 사실 내가 디버거에서 보면 처음과 거짓 내가 보는 두 번째 시간이 될 것이며, 그 다음 밖으로 떨어질 것 루프가 그 시점에서 디버거의 인공물이 아니라는 것을 증명합니다. 실제로는 false로 설정됩니다.

연결이 끊어지면 네트워크 스니퍼와 연결된 활동이 없습니다. 즉, 호스트와의 연결이 끊어지지 않고 있습니다.

이것은 단일 스레드 응용 프로그램입니다. 이후에 소켓을 사용하려고 할 때 종종 연결이 끊어져서 왜 그 이유를 알아 내려했기 때문에 나는 이것을 보았습니다.

+0

그래서 이전에 발견 한 문제가 사실임을 입증했습니다. 여전히 연결 해제의 원인을 찾지 못했습니다. 환경적인 측면에서 맬웨어 방지 및 방화벽과 같은 것들부터 시작하십시오. –

+1

나는 아직도 내가하고있는 일이라고 생각한다. System.Net 소켓은 모든 종류의 것들에 널리 사용됩니다. 따라서 방화벽이나 맬웨어 방지 프로그램이 자발적으로 소켓을 연결 해제하는 경우 많은 것들이 엉망이 될 것으로 예상됩니다. FWIW 내가 쓰고있는 프로그램은 Winsock을 사용하는 고대 VB6 프로그램의 대체품이며 같은 IP 주소와 포트에 잘 연결되어 실행됩니다.내 코드라고하는 또 다른 데이터 포인트는 Win7과 XP PC에서 서로 다른 방화벽과 맬웨어 방지 프로그램을 실행하면서 재현 할 수 있다는 것입니다. – user316117

+0

나는 그것을 디버거로 생각했지만, 디버거에서 이것을 처음 보았던 것은 그것이 자연스럽게 끊어져 버렸다는 것을 기억한다. 여전히, 나는이 코드를 썸 드라이브에 넣고 오늘 밤 집에 가져 가서 집에서 가지고있는 약간 다른 디버거에서이 코드를 시험해보기로했다. – user316117

답변

-1

이 문제는 Visual Studio 2010 Express 디버거의 버그 인 것 같습니다.

위의 설명에서 언급했듯이 디버거의 두 번째 터치에서 자연스럽게 끊어지는 이상한 동작은 별도의 두 PC (XP 시스템과 Win 7 PC)에서 발생했습니다. 더 자세하게 설명하기 위해 XP 시스템은 산업용 장비에 연결하고 Win7 PC는 로컬 호스트에 연결하고있었습니다. 두 PC 모두 Visual C# 2010 Express를 실행하고있었습니다.

그래서 저는 Visual Studio 2010의 전체 프로 버전에서이 기능을 시도했지만 이러한 동작이 발생하지 않았습니다.

디버거가 더 이상 연결 해제되지 않으면 처음에 디버거를 처음 보았던 연결 해제 문제가 쉽게 발견되었습니다. 저는 이것이 30 년 동안 프로그래밍에서 보아온 가장 이상한 문제 중 하나라고 생각합니다.

+0

만약 * that *가 30 년 동안 프로그래밍에서 만난 가장 이상한 문제 중 하나라면 ... * –

+0

무례하고 무의미한 코멘트. 비슷한 것을 보았습니다 -하지만 VS2010 Pro에서는 - 나는 프로그래머로서 48 년 동안의 경험으로 꽤 이상합니다. 4 명의 다운 voters는 부서지는 인간이다. 아마 그들은 마이크로 소프트에서 일한다. –