2014-11-08 3 views
0

두 방향으로 닫히지 않으면 만료 타이머와 상관없이 절대로 닫히지 않습니까? - 반 닫을 수 있지만 close() 만 시작하면 tcp 연결이 종료 될 수 있습니까?tcp 연결 종료시

다른 말로하면 : TCP 연결 종료 - 클라이언트 만 닫기를 시작했지만 서버는 연결을 완전히 닫을 수 있습니까? 또는 두 가지 방법으로 TCP 연결을 개별적으로 닫을 수 있습니까?

+1

정교하게 말하면, 나에게 불분명하다. – peterh

+0

문맥 상 명확하지 않은 많은 용어를 사용하고 있습니다. 예를 들어, "양방향으로 닫기"라고 말하면, 각면이 "닫기"를 부르는 것을 의미합니까? 아니면 TCP 연결의 두 방향 (각각 양방향 스트림입니다)을 의미합니까? 종료가 발생합니까? "반 폐쇄 (half-close)"라고 말하면 한쪽이 스트림의 양방향을 닫았다는 의미입니까? 또는 한 쪽이 보내기 방향을 닫았지만 수신 방향이 아직 열려 있음을 의미합니까? 귀하의 질문은 모호한 용어로 가득 차서 당신이 요구하는 것을 이해하는 것을 불가능하게 만듭니다. –

+0

그리고 더 모호한 용어는 "닫기를 시작합니다"라는 말은 "닫기"를 의미합니까? 아니면 그것이 더 이상 보내지 않을 것이라는 것을 나타 내기 위해'shutdown'을 호출한다는 의미입니까? 또는 다른 것? –

답변

1

각 피어는 다른 것과 독립적으로 TCP 연결을 닫을 수 있습니다. 피어에서 읽으려고하면 피어가 단순히 EOF (예 : 더 이상 바이트)를 얻지 못하거나 피어에서 쓰기를 시도하는 경우 ECONNRESET 또는 EPIPE를 가져옵니다. 연결은 피어에 의해 닫혔지만 소켓이 피어가 더 많은 데이터를 받기를 원하지 않는다는 것을 알고있는 경우에만 아래를 참조하십시오.

는 연결을 닫으면 실제로 두 부분으로 구성

  • 응용 프로그램은 더 많은 데이터를 전송하지 않습니다 : shutdown(sock,SHUT_WR). 이 경우 커널은 피어에게 FIN을 전송하므로 더 이상의 데이터가 따르지 않는다는 신호를 보냅니다. 피어에서 읽으면 EOF가 반환됩니다.
  • 응용 프로그램에서 더 많은 데이터를 받고 싶지 않습니다. shutdown(sock,SHUT_RD). 이 경우 처음에는 피어에게 정보가 전송되지 않지만 피어로부터 데이터를 받으면 RST로 거부됩니다.

따라서 close()의 호출은 동시에 연결의 양쪽을 종료하는 것과 같습니다 (SHUT_RDWR).