SOCKET

C++ 2010. 10. 9. 14:43
Client 모델
 : 하나 이상의 소켓 처리시 overlapped I/O 모델이나 WSAEventSelect 모델이 성능상 유리.
   윈도우 기반일 경우 WSAAsyncSelct 모델이 개발 편의성 제공.
   
Server 모델
 : 동시에 몇개의 소켓 처리시 overlapped I/O 모델이 성능상 유리.
   대량의 I/O 처리시 IOCP 모델이 성능상 유리. 

소켓 모델의 장단점

SPI(Service Provider Interface) : http://msdn.microsoft.com/en-us/library/ms741418.aspx (스펙)
윈도우 소켓은 소켓 인터페이스와 트랜스포트 계층(OSI 7계층) 사이에 SPI 계층이 있다.
SPI는 본질적으로 DLL이며 윈도우 시스템의 모든 소켓 송수신의 데이터 모니터링, hook이 가능하며
다른 소켓 어플리케이션을 통제할 수 있다.
winpcap 같은 라이브러리를 통해서도 가능하나 SPI는 ms에서 제공하는 표준적인 방법이다.

2MSL (2 * maximum segment lifetime)
TCP는 TcpTimedWaitDelay에 지정되어 있는 시간이 지나지 않을 경우
연결을 해제하지도 않고 그 연결에 사용된 자원을 재사용하지 않는다.
이 시간을 TIME_WAIT 또는 2MSL 상태라 한다.

Port
    [0,      1023]   : Well-known ports. 표준으로 예약된 포트 영역
    [1024,  49151] : Registered ports. 어플리케이션에서 사용하는 포트 영역
    [49152, 65535] : Dynamic ports. 필요에 따라 할당되는 포트 영역


socket 생성 옵션
TCP : PF_INET, SOCK_STREAM, IPPROTO_TCP
UDP : PF_INET, SOCK_DGRAM,  IPPROTO_UDP

socket 기본 함수
socket  : socket 생성
bind     : 주소 bind
listen    : 대기중인 socket임을 지정 (LISTENING 상태)
accept  : client의 접속 요청을 받음
connect : server로 연결
send     : 데이터 보냄
recv      : 데이터 받음
closesocket : socket 닫음

**. 샘플 소스는 Visual Studio C++ 2008 Unicode Console Project 로 작성됨.



TCP
UDP



SOCKET mode

blocking mode
 : default. 입출력 작업 완료시 까지 block. recv() 함수 처럼 대기하는 경우.

non-blocking mode
 : 입출력 작업 완료와 상관없이 무조건 리턴.
   ioctlsocket() 함수로 non-blocking mode 지정.
   ioctlsocket() 사용시 소스가 복잡해짐.
   또한 함수 내부 loop문의 CPU 자원 과소비로 인해 소켓 모델 사용 권장.



Windows SOCKET Model
1. blocking (single-thread 기반)
2. select (single-thread 기반)
3. WSAAsyncSelect (single-thread 기반)
4. WSAEventSelect (multi-thread 기반)
5. Ovelapped (multi-thread 기반)
6. IOCP (multi-thread 기반)

1. blocking model
일반적인 send(), recv() 형식의 SOCKET 통신.

2. select model
UNIX, Windows 모두 지원되는 모델.
많지 않은 socket 처리시 장점을 갖는 모델.
사건/이벤트 발생시 함수 호출.
single-thread 기반에서 여러 socket들의 non-blocking 구현이 가능하다.


3. WSAAsyncSelect model
3-1. WinAPI WSAAsyncSelect model


3-2. MFC WSAAsyncSelect model : CSocket
**. MFC project 생성시 "Advenced Features > Windows sockets"를 선택한다.


4. WSAEventSelect model