본문 바로가기

TCP & IP

7-1 TCP 소켓의 일방적인 연결 종료?

 

앞서 우리는 TCP소켓의 장점으로 서버와 클라이언트간의 연결을 통한 안전성이라고 말했죠? 그렇다면 서버가 강제로 종료되었을때는 어떻게 될 지 알아봐야하겠죠? 만약에 호스트 A와 B가 있다고 가정을 하고 A가 B에게 마지막 데이터를 전송하고 close 함수를 호출하여 종료시켰다고 생각해봅시다! 그렇다면 B는 더 이상 A에게 데이터를 전송도 수신도 하지 못하는 상태가 돼버리고 말 것입니다. 이러한 문제를 해결하기 위해서 일부만 종료시키는 Half-close를 사용하게 되었습니다! 쉽게 말해 전송은 가능하지만 수신은 불가능하거나, 수신은 불가능한데 전송은 가능한 상태를 의미합니다.

호스트A가 강제종료된 경우

소켓을 통해 두 호스트가 연결된 상태

 

우리가 Half-close를 하기 위해 사용하는 함수는 shutdown입니다.

위 함수에서 우리는 두 번째 매개변수를 통해 종료 방법을 결정할 수 있습니다. 두 번째 매개변수에는 총 3가지의 종류가 들어갈 수 있는데 아래와 같습니다.

SHUT_RD가 전달되면 입력 스트림이 종료되어 더 이상 데이터를 수신할 수 없는 상태가 되고 SHUT_WR가 전달되면 출력 스트림의 종료로 더 이상 데이터를 전송할 수 없게된다. 하지만 이미 버퍼에 저장되어있던 데이터들은 목적지까지 전송하게 된다는 점을 기억하기! 그리고 SHUT_RDWR은 둘다 종료시키는 것으로 생각하면 된다.

여기서 우리는 출력스트림을 종료시켜 EOF(END OF FILE)가 될 때까지 데이터를 수신할 수 있게 해주는 코드를 작성해 볼 것이다.

 

 

 

위의 코드를 작성 후 fserver를 통해 서버를 열고 fclient로 접속을 하면 server는 아래와 같은 문구가 나타나게 되고 client에서는 데이터를 받았다고 뜨게 됩니다. 이렇게 되면 완료!!