2017-09-14 10 views
0

나의 이해는 주로이 튜토리얼에서 유래 : 클라이언트와 서버가 서로 다른 시스템과 프록시에서 실행중인 TCP 클라이언트/서버 모델을 감안할 때소켓 작업을 사용하여 응답하지 않는 TCP 서버에 대해 알리는 방법은 무엇입니까? 소켓 프로그래밍에 대한

CS 50 Software Design and Implementation, Lecture 19, Socket Programming

그들 사이에의 가정 클라이언트가 프록시를 통해 서버에 메시지를 보낼 수 있으면 서버가 갑자기 응답하지 않게됩니다 (예를 들어 다시 설정 됨). 프록시와 서버 간의 연결은 어떻게되며 어떻게 처리 할 수 ​​있습니까?

내 말은, 어떤 기술을 사용하여 이러한 이벤트를 감지하고 연결을 닫은 다음 클라이언트에게 오류 메시지를 반환 할 수 있습니까?

내가 생각할 수있는 한 가지 방법은 프록시에서 수신 버퍼를 확인하고 잠시 동안 데이터가없는 경우 클라이언트에게 서버가 다운되었음을 알려주는 것입니다. 하지만 시간 초과는 원시적 인 접근이라고 생각합니다. 이것을 위해 소켓 프로그래밍에서 알려진 표준 방법이나 대안이 있습니까?

+1

클라이언트, 서버 또는 프록시를 구현하고 있습니까? 어느 쪽이든, TCP는 사용할 수있는 내장 된 keep-alive heartbeat를 가지고 있습니다. 실행중인 플랫폼에 따라'setsockopt (SOL_SOCKET, SO_KEEPALIVE)'또는'setsockopt (SOL_TCP, TCP_KEEPCNT/TCP_KEEPIDLE/TCP_KEEPINTVL)'또는'WSAIoctl (SIO_KEEPALIVE_VALS)'를 사용할 수 있습니다. 하트 비트가 실패하면 연결이 끊어졌습니다. 따라서 소켓 핸들을 닫으십시오. –

+0

"_ 지정된 TCP 클라이언트/서버 모델 ... _"TCP에 클라이언트 또는 서버가 없습니다. 클라이언트/서버 모델은 응용 프로그램 계층 모델입니다. TCP는 피어 호스트 간의 연결을 설정합니다. –

답변

0

클라이언트와 서버가 서로 다른 두 시스템에서 실행 중이고 프록시가 그 사이에있는 TCP 클라이언트/서버 모델에서 클라이언트는 프록시를 통해 서버에 메시지를 보낼 수 있다고 가정합니다 갑자기 응답이 없어집니다 (초기화되었다고 말함).

  1. 아무것도 : 무슨 프록시 서버

어느 사이의 연결에 발생합니다.

  • A는 타임 아웃을 읽거나
  • 는 프록시가 무엇을하고 있는지에 전적으로 의존
  • 를 '연결 재설정'오류. 수신 중이면 이미 (2) 또는 (3) 보류중인 보류가있는 경우. 보내는 경우 (3), 버퍼링으로 인해 첫 번째 전송시에는 전송되지 않습니다. 결국 send는 (3)을 일으킬 것이다.

    어떻게 처리하나요?

    클라이언트와의 연결을 닫습니다. 리셋 된 것이라면, 여기에 문서화하지 않을 기술을 통해 클라이언트에게 널리 퍼뜨릴 수 있습니다. 읽기 시간 제한이라면 5 분 동안 아무 작업도하지 않거나 적절한 작업을 수행 한 다음 연결을 닫거나 다시 설정하여 클라이언트에 전파하려고 할 수도 있습니다.

    내 말은, 어떤 기술을 사용하여 이러한 이벤트를 감지하고 연결을 닫은 다음 클라이언트에게 오류 메시지를 반환 할 수 있습니까?

    위 참조.

    내가 생각할 수있는 한 가지 방법은 프록시에서 수신 버퍼를 확인하고 잠시 동안 데이터가없는 경우 클라이언트에게 서버가 다운되었음을 알려주는 것입니다. 하지만 시간 초과는 원시적 인 접근이라고 생각합니다.

    아니요.

    이에 대한 소켓 프로그래밍에서 알려진 표준 방법이나 대안이 있습니까?

    위 참조.

    +0

    해답을 가져 주셔서 감사합니다.하지만 직접 언급 한 것보다 좀 더 몰래 들어갈 수있는 자료 또는 웹 링크를 참조 할 수 있다면 "널리 널리 사용되고 있으므로 여기에 문서화하지 않을 기술을 통해"지식 술에 대해 감사하겠습니다. . 그것의 2000 페이지 책 및 응답이 거기 있더라도 나는 그것을 꺼내는 마음을 놓지 않을 것이다. 당신이 편안하다면 나는 심지어 내 메일 ID를 제공 할 수 있습니다. – achoora

    +0

    제한 시간이 0 인 SO_LINGER를 검색해야합니다. – EJP