TCP 클라이언트와 서버는 소켓이라는 별명을 가진 파일을 생성하고, 해당 파일에 값을 쓰거나 읽는 방식으로 통신한다고 착각하도록 만든 것이다. 많은 사람들이 ‘소켓은 파일이다’ 라고 생각하지만, 실제로는 그렇지 않다. 이렇게 사람을 착각하게 만들지만 소켓 프로그래머 입장에서 그러한 관점은 복잡성을 크게 감추어 준다는 점에서 소켓을 파일로 여기는 것은 훌륭한 추상화다. 정리하면, 소켓의 정체가 실제로 파일이라는 것이 아니다. 파일에 값을 쓰듯 소켓에 값을 쓰면 네트워크 너머의 컴퓨터가 파일의 값을 읽듯 소켓에 작성된 값을 읽어들일 수 있다는 것이다.
소켓 프로그래밍을 구현하는 C 소스코드를 살펴보자. 클라이언트와 서버는 통신을 위해 각각 socket() 함수를 이용해 소켓과 소켓에 값을 읽고 쓸 수 있도록 파일 디스크립터를 얻는다. 하지만 클라이언트는 소켓을 원격지의 주소에 연결하기 위해 connect() 함수를 사용하고, 서버는 소켓을 로컬 주소에 연결하기 위해 bind() 함수를 사용한다(참고1).
파일에 값을 쓸 때에는 파일에 쓸 수 있는 값의 형태로 변환해야 한다. 쓸 데이터를 직렬화하기 위해 endode() 함수를 사용한다. 이렇게 직렬화된 형태로 파일에 쓰여진 값을 다시 읽을 때에는 읽을 데이터를 역직렬화하기 위해 decode() 함수를 사용한다.
parse me : 언젠가 이 글에 쓰이면 좋을 것 같은 재료들.
1.
from : 과거의 어떤 생각이 이 생각을 만들었는가?
1.
4.
•
netstat명령어 출력에서 소켓을 어떻게 확인할 수 있는지 궁금하다면 참고하라.
supplementary : 어떤 새로운 생각이 이 문서에 작성된 생각을 뒷받침하는가?
1.
opposite : 어떤 새로운 생각이 이 문서에 작성된 생각과 대조되는가?
1.
None
to : 이 문서에 작성된 생각이 어떤 생각으로 발전되고 이어지는가?
2.
참고 : 레퍼런스