2014-05-10 2 views
2

저는 Linux 컴퓨터에서 실행되는 서버 응용 프로그램이 있습니다. 이 응용 프로그램을 Windows/Linux 컴퓨터에서 연결할 수 있으며 데이터를 보내거나받을 수 있습니다. 몇 시간이 지나면 무언가 발생하고 클라이언트 측에서 다음과 같은 오류가 발생합니다. Windows에서TCP/IP 장기 연결

: An existing connection was forcibly closed by the remote host

Linux의 경우 : 내가 웹에서 검색을 만들어/감소 OS에서의 증가하는 것이 좋습니다 일부 게시물을 발견 Connection timed out

살아 시간을 유지. 그러나, 그것은 나를 위해 일하지 않았다.

이 문제가 발생했거나 강제로 연결을 닫았을 때 서버에 다시 연결해야합니까?

편집 : 나는 상황을 추적했다. 원격 노드에 데이터를 보내고 5 시간 후에 다른 데이터를 보냈습니다. 송신 측은 첫 번째 데이터를 보냈지 만 송신자가 응답하지 않은 두 번째 데이터를 보냈습니다. 재전송 사이의 시간 간격을 증가 시켜서이 5 번 반복 된 발신자의 TCP/IP 스택. 마지막으로 발신자가 연결을 재설정합니다. (Section 4.2를)

  1. 을 사용하여 TCP/IP setsockopt를을 사용하여 활성 상태를 유지 - (Section 2.4를 참조 어쩌면 때문에 방화벽이나 NAT의) 그러나 나는이 문제를 해결하기 위해 두 개의 서로 다른 접근 방식을 적용 나는 이런 일이 왜 확신 할 수 없다
  2. 응용 프로그램 수준을 유지하십시오. 첫 번째 방법은 OS와 관련되어 있기 때문에 더 신뢰할 수 있습니다.
+1

이 질문/답변을 읽었습니까? http://stackoverflow.com/questions/2582036/an-existing-connection-was-forcibly-closed-by-the-remote-host – jdiver

+0

지금 읽었습니다. 나는 wireshark를 통해 exchaged 데이터를 추적 할 것이다. –

답변

1

응용 프로그램이 수행해야하는 작업에 따라 다릅니다. 좀 더 많은 정보와 연결을 듣고 처리하는 데 사용하는 코드가 도움이 될 수 있습니다.

기술적으로 긴 지속 시간은 OS가자를 수 없게해야합니다. 그래서 아마도 그것은 문제를 일으키는 또 다른 것입니다.

이러한 일은 라우터 오작동이나 트래픽으로 인해 연결 유지 패킷이 손실 될 수 있습니다. LAN (무거운 트래픽없이)에서 아직 테스트하지 않은 경우 그렇게하는 것이 좋습니다.

소켓이 어떻게 처리 되었기 때문일 수도 있습니다 (귀하의 질문에서 확인할 수 없음) 이 문서가 도움이 될 수 있습니다. Non blocking socket with timeout

Linux에서 연결을 처리하는 방법에 익숙하지 않지만 OS가 연결을 필요로하지 않을 것으로 예상합니다. 연결을 복구로 재설정 할 수 있지만 모든 연결 끊기가 부드럽지는 않다는 점을 고려해야하기 때문에 실제로 닫으려고하는 연결에서 복구를 완료 할 수 있습니다.

TCP이므로 부드러운 분리를 위해 최선을 다하지만 서버 나 클라이언트에게 연결을 끊기 전에 연결을 다시 설정하지 말라는 메시지를 보낼 수 있습니다. 당신이 절대적으로 확신하는 그런 식으로, 그렇게하는 것은 불필요합니다.