앞서 우리는 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에서는 데이터를 받았다고 뜨게 됩니다. 이렇게 되면 완료!!
'TCP & IP' 카테고리의 다른 글
8-1 IP주소는 뭐고 도메인 주소는 무엇일까? (0) | 2021.10.06 |
---|---|
6-2 UDP TCP의 포트가 연결이 되지 않을때! (0) | 2021.10.06 |
6-1 UDP (0) | 2021.10.06 |
5-1 TCP 소켓의 연결 (0) | 2021.10.06 |
4-1 TCP기반 서버, 클라이언트 구현 (0) | 2021.10.06 |