본문 바로가기
네트워크, 서버/소켓,프로토콜

(소켓,프로토콜)Linux와 Windows에서의 소켓

by 흥부와놀자 2020. 6. 30.

컴퓨터와 컴퓨터끼리의 네트워크 통신을 위해서 여러 과정이 필요하지만 나처럼 SW를 프로그래밍하는 사람에겐 복잡한 과정을 대신 해주는 소켓이라는 아주 고마운 도구가 있다.  이번에는 Linux와 Windows 운영체제에 따른 전반적인 소켓의 특성에 대해 공부한걸 써보고자 한다.

 

먼저 Linux에서 소켓이란 단순히 파일로 취급된다. 리눅스에서 각 파일에 매겨지는 정수를 파일 디스크립터라고 하는데

위와 같이 0,1,2번은 표준입출력으로 고정되어있다. (표준입력은 키보드로 입력된 파일, 표준출력은 모니터로 출력될 파일을 생각하면 된다.)

그래서 소켓과 같은 파일들은 3번부터 할당되고 사용자는 해당 디스크립터를 통해 원하는 파일을 쉽게 찾는다.

(설명링크 https://dev-ahn.tistory.com/96

 

소켓은 파일이기에 파일을 읽고 쓰고 닫는 함수 read, write,close를 소켓에서도 똑같이 사용가능하다. 단 파일을 생성할땐 open()을 쓰지만 소켓은 socket()을 쓴다. 

read(파일디스크립터, 수신받은 데이터를 저장할 버퍼의 주소값, 수신할 최대 바이트 수 )

write(파일디스크립터, 전송할데이터가 담긴 버퍼주소값 , 전송할 데이터 바이트 수 )

-> 생각보다 헷갈린다. 처음 소켓으로 코드짤때 가장 많이 틀렸던 부분이다.

 

Windows의 소켓은 BSD계열 유닉스 소켓을 참고하여 설계되었기 때문에 리눅스 소켓과 크게 다르지 않다. 다만 Linux가 소켓을 하나의 파일로 취급했다면 Windows는 파일과 다르게 사용된다. 

Linux가 소켓을 파일디스크립터로 구별한 것처럼 Windows에서는 Handle로 구별한다. 

사실 이 핸들도 결국 OS의 숨겨진 커널객체를 사용하고 구별하기 위한 것으로 사용되기에 어찌보면 파일 디스크립터와 비슷한 개념인것 같다.  (설명링크 https://wonjayk.tistory.com/270)

 

Windows는 파일Handle과 소켓Handle을 따로 구별하기에 소켓을 다루는 함수가 리눅스와 차이가 있다.

Linux에서 쓰는 read, write, close 대신에 recv, send, closesocket을 사용한다. 매개변수도 같다. 

 

이러한 내용들은 소켓프로그래밍을 할때 기초가 되는 내용중 하나지만 앞으로 이해함에 있어서 꼭 필요한 내용일것이다.