더북(TheBook)

3.2 운영체제별 API 차이

 

여러 플랫폼에서 저수준 인터넷 인터페이스를 위해 버클리 소켓을 표준으로 이용할 수 있지만, API가 모든 운영체제에서 완전히 똑같은 것은 아니다. 플랫폼마다 특기 사항 및 차이점이 있으므로 크로스 플랫폼으로 소켓 개발을 시작하려면 미리 알아두고 가는 편이 좋을 것이다.

첫째 차이점은 소켓 자체를 나타내는 자료형이 무엇인가 하는 것이다. 앞에서 본 socket() 함수의 리턴 자료형은 SOCKET형인데, 이 자료형은 윈도 10이나 XBox 등 윈도 기반 플랫폼에서만 실체가 존재한다. 윈도 헤더 파일을 조금 파보면 SOCKETUINT_PTR에 대한 typedef인 것을 알 수 있는데, 이 포인터는 소켓의 상태와 데이터를 저장하는 메모리 영역을 가리키는 것이다.

반면, POSIX 기반 플랫폼인 리눅스, macOS, 플레이스테이션에선 소켓은 그냥 int 값 하나에 불과하다. 소켓이란 자료형이 실제로 존재하지 않으며 socket() 함수는 int 값 하나를 리턴할 뿐이다. 이 값은 현재 열려있는 파일과 소켓의 목록상 인덱스를 나타내는데, 이 목록은 운영체제 내부에 숨겨져 있다. 그런 면에서 소켓은 POSIX 파일 디스크립터(file descriptor)와도 매우 유사하다. 실제로 파일 디스크립터를 받는 운영체제 함수에 소켓 값을 대신 넘겨도 잘 동작한다. 소켓을 이렇게 사용하면 전용 소켓 함수보다 유연성은 좀 떨어지지만, 기존에 네트워크용으로 구현되지 않은 프로세스가 네트워크를 지원하도록 손쉽게 포팅할 수 있다. 다만 socket() 함수가 정수를 리턴하는 것에는 큰 단점이 하나 있는데, 자료형 안전성이 많이 부족하다는 것이다. 즉, 함수의 인자로 아무 정숫값이나(5×4 같이) 집어넣어도 컴파일러가 전혀 알아채지 못한다. 이는 버클리 소켓 API의 주된 약점 중 하나로, 이 장에서 구현할 여러 예제 코드에서 이를 보완해나갈 것이다.

신간 소식 구독하기
뉴스레터에 가입하시고 이메일로 신간 소식을 받아 보세요.