WinCNT

소켓 본문

소켓

Unix가 시초, 버클리 대학에서 만들었다

그 이후 각각의 운영체제에 맞게 개발되었다

 

소켓 통신

Client에 소켓을 만들고, 서버에도 하나 만들자

그 다음에는 소켓에 IP주소를 부여하자

 

OS 입장에서는 어떤 프로세스에게 부여할지 알아야 한다

그 때 필요한 것이 Port

 

채팅 클라이언트 - 채팅 서버를 예로 들어보자

클라이언트에서 데이터를 LAN카드를 통해 보내자

서버의 LAN카드에 도착(IP주소를 알테니)

그 다음 포트로 채팅 서버를 찾을 것이다

 

그 때 도착한 데이터는 소켓 버퍼 안에 담긴다

소켓을 많이 만들면 소켓마다 버퍼를 만들 테니 메모리를 많이 차지한다

소켓 버퍼는 커널 영역이므로, 소켓 버퍼를 많이 만들면

결국 터져서 블루 스크린이 터질 것이다

 

FTP와는 다르다

FTP는 소켓 하나에 데이터를 루프를 돌면서 꾸준히 보낸다는 이미지

 

채팅의 경우는 소켓은 많은데 도착하는 데이터는 작고 빈도도 많지 않다

문제는 많은 소켓들이 어디에 도착했는지를 구분해야 한다

예전에는 폴링(계속 물어보는) 방식을 사용했지만

최근에는 Idle Queue에 넣어서 도착하면 인터럽트를 발생해서

CPU에 알려주는 방식을 채택하고 있다(IOCP 방식)

 

IOCP에서는 동시에 수행시킬 스레드 개수를 설정할 수 있다

 

잘못 짠 코드의 예

A가 B에게 귓속말을 한다고 할 때,

User List를 검색(Lock을 건다)하고, Send(시스템 콜)을 한다

심지어 Send 시에는 소켓 버퍼의 Read, Write에 복사만 할 뿐 바로 보내지는 것도 아니다