Thursday, January 27, 2011

chapter 7 (소켓의 우아한 연결종료)

-TCP 기반의 Half-close-
TCP에서 연결과정에서는 큰변수가 생기지 않지만 종료과정은 그렇지 않다. 따라서 종료과정은 명확해야 한다,

일방적인 연결종료의 문제점
close함수는 완전 종료를 의미. 이는 데이터의 전송뿐 아니라 수신하는 것 조차 불가능하게 한다.
half-close 란 데이터의 송수신에 사용되는 스트림의 일부만 종료하는 것으로 전송은 가능하지만 수신을 불가능 하거나 반대로 전송은 불가능 하지만 수신은 가능한 종료를 의미 한다.

소켓과 스트림 
두 호스트가 소켓을 통해 연결된 상태를 '스트림이 형성된 상태'라고 한다. 좀더 자세하게 이야기 하자면 두 호스트는 두개의 스트림에 의해 연결된 상태이다.  호스트 A에서의 출력스트림은 호스트 B의 입력 스트림과 연결되고 A의 입력스트림은 B의 출력 스트림과 연결된 상태이다.
close 함수를 쓰면 이 두 스트림이 다 끊기는 경우고 half-close는 하나만 끊는거다.

우아한 종료를 위한 shutdown 함수
half-close를 위해 shutdown 함수를 사용한다. int shutdown(int sock, int howto); 의 형태로 성공시 0 실패시 -1 반환. 두번째 인자의 종류로는 SHUT_RD, SHUT_WR, SHUT_RDWR. RD는 입력스트림 종료(데이터 수신 불가능), WR는 출력 스트림 종료(데이터 송신 불가능), RDWR는 둘다 종료.

Half-close가 필요한 이유
서버가 클라이언트로 데이터를 전송하고 전송이 다 마치면 클라이언트라 서버로 메시지를 하나 던지는 상황을 생각해보면, 데이터 전송이 다 끝났다는 표시는 서버가 클라이언트로 EOF를 전송하는 것인데 close를 써서 EOF를 던지게 되면 마지막에 클라이언트로 부터의 메시지를 수신할 수 없게 된다. 그렇기에 출력 스트림만 종료하는 상황이 필요. 그럴때 shutdown 함수 사용.

Half-close 기반의 파일 전송 프로그램




*애매한게 있었는데 EOF를 던진다는 것은 사실은 -1을 던진다는 것이고 read 의 경우 EOF를  받게 되면 return을 0을 한다.

No comments:

Post a Comment