2009-09-10 4 views
1

몇 년 동안 잘 돌아가고있는 C# 응용 프로그램이 있습니다. TCP/IP 소켓을 통해 주식 거래를 보내는 기계에 연결합니다.소켓의 한 쪽 끝이 Disconnected, 방화벽입니까?

최근에는 하드웨어 방화벽 뒤에있는 새로운 데이터 센터의 일부 컴퓨터에이를 배포하려고 시도했지만 이상한 연결이 끊어지기 시작했습니다.

연결이 끊어지면 내 앱 (클라이언트 측)에서 소켓을 통해 데이터 수신을 중지한다는 것 외에는 별다른 차이가 없습니다. Wireshark는 소켓에 도달하는 데이터가 없음을 확인하고 디버거에서 응용 프로그램의 수신 스레드가 Receive() 호출을 차단할 때이를 차단합니다. 소켓은 netstat에 ESTABLISHED로 표시됩니다.

하지만 서버 측에서 내 클라이언트의 연결이 끊어져있는 것처럼 보입니다. 로그를 살펴보면 끝 부분의 소켓이 보통 (nRecvd = -1, errno = 104) 또는 (nRecvd = 0, errno = 11)으로 끝나는 것처럼 보입니다. (104는 피어에 의한 연결 재설정 임).

연결 해제는 일정 기간 동안 작동하지 않는 경우에만 발생하는 것으로 보입니다. 지금 클라이언트와 서버 사이에 짧은 메시지를 보내고 응답을 얻는 하트 비트를 구현하여이 문제를 해결했습니다. 이로 인해 연결 해제가 지난 며칠 동안 0으로 떨어졌습니다.

처음에는 하드웨어 방화벽이 문제라고 생각했습니다. 작동하지 않으면 소켓이 시간 종료됩니다. 그러나 방화벽 책임자는이 포트 (8887)의 연결 시간 제한이 2160 분이라고 주장합니다.

Windows Server 2003 및 .NET 3.5를 실행하고 있습니다. 트레이드 서버는 리눅스 머신입니다 (확실하지는 않지만 sles9라고 생각합니다).

무슨 일이 벌어지고 있는지에 대한 아이디어가 있습니까? 방화벽 로그에 액세스 할 수없고 무역 서버의 코드를 변경할 수있는 능력이 없다는 점을 감안할 때이 코드를 디버깅하려면 어떻게해야합니까?

감사합니다, 마이크

답변

1

공통이며, 같은 방화벽/게이트웨이를 통해 살아 TCP 소켓을 유지하기 위해 하트 비트를 구현하는 것이 일반적이다 너는 그랬다.

하드웨어가 2160 분의 시간 초과 (내 경험으로는 20-30 분이 더 일반적 임)가있을 수 있지만,로드가 있으면 연결이 일반적으로 훨씬 더 공격적으로 중단됩니다. 이러한 방화벽은 리소스가 제한되어 있으며 더 많은 연결 추적이 필요할 경우 하드 제한 시간 설정과 관계없이 모든 활동없이 추적 된 가장 오래된 연결을 끊는 경향이 있습니다. 당신이 더 많은 디버깅 방화벽의 서버 측에서 냄새 가서 서버가 분리에게

+0

감사를 얻을 때 anyting 경우, 무슨 일이보고 싶다면

, 그냥 내가 트랙에 있던 있는지 확인하고 싶었 방화벽 가설과 함께. 그들은 방화벽에서 무역 서버로의 경로에서 나에게 아무 것도 붙잡지 않을 것이다.결국 방화벽으로 판명되었습니다. 그들은 포트 번호를 확인하기 위해 10 배를 요구하면서도 잘못된 포트를 차단 해제했습니다. –

0

내가 방화벽의 양쪽에 설치 wiresharp은 TCP (낮은 수준)에 무슨 일이 일어 나는지하는 것입니다. 그리고 관리자가 "연결 시간 제한"이라고 말하면 뭔가가 있습니다. 유휴 상태의 연결에 대한 시간 초과입니까? 내가 생각하는 다른 말은하지 않는다.

또한 TCP에 KeepAlive 옵션을 사용하고 있습니까? 그리고 그것은 방화벽에 의해 전달 되었건 안되나요? 당신이 무엇을 설명

내가 말했듯이, 아마 방화벽의 양쪽에 와이어 샤크를 실행하려면 ...

관련 문제