온라인 게임 서버(기초편)
2.1 소켓
2.1.1 소켓이란
- 1982년 BSD 유닉스에 소개
2.1.2 소켓의 유형(스트림 소켓과 데이터 그램 소켓
- TCP/IP : 스트림 방식, 양방향 연결
- UDP/IP : 데이터 그램 방식
2.1.3 소켓의 동작 모드(blocking, non-blocking)
- 블러킹 : 기본 모드, 작업 완료 해야 반환
- 넌 블러킹 : ioctlsocket()로 바꿔준다
2.2 윈속(Winsock)
- winsock 2.2
2.2.1 연결지향형 통신
클라이언트 : socket() -> connect() -> recv(), send(), closesocket()
|
+-------------+
|
서버 : socket() -> bind() -> listen() -> accept() -> recv(), send() -> closesocket()
2.2.1.1 소켓 생성 함수
- SOCKET socket(int af, int type, int protocol)
- 소켓을 생성하여 반환
SOCKET sockNew = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if(INVALID_SOCKET == sockNew)
{
//에러처리}
2.2.1.2 클라이언트 측 함수
2.2.1.3 서버측 함수
2.2.1.4 데이터 전송 함수
2.2.1.5 연결 종료 함수
2.2.2 비연결지향형 통신
2.2.3 그 외 함수들
2.3 쓰레드(Thread)
2.3.1 C런타임 라이브러리
2.3.2 Win32 라이브러리
2.3.3 쓰레드 종료
2.4 동기화(Syncronization)
2.4.1 커널 객체(Kernel Object)
2.4.2 커널모드와 유저모드(Kernel Mode and User Mode)
2.4.3 유저 모드에서의 동기화
2.4.4 커널 모드에서의 동기화
2.4.4.1 이벤트(Event)
2.4.4.2 뮤텍스(Mutex)
2.4.4.3 세마포어(Semaphore)
2.5 Windows I/O 모델
- select, WSAAsyncSelect, WSAEventSelect, Overlapped I/O(Event), Overlapped I/O(Callback), Completion Port I/O(Non-Albetrable), Completion Port I/O(Albetrable)
2.5.1 select 모델
2.5.2 WSAAsynSelect 모델
- int WSAAsyncSelect(SOCKET s,
HWND hWnd,
unsigned int wMsg,
long lEvent);
- 소켓 입출력을 윈도우 메세지로 통보(윈도우가 반드시 있어야 함)
- lEvent : FD_READ, FD_WRITE, FD_OOB, FD_ACCEPT, FD_CONNECT, FD_CLOSE
2.5.3 WSAEventSelect 모델
- 윈도우 없이 사용 가능
- int WSAEventSelect( SOCKET s,
WSAEVENT hEventObject,
long lNetworkEvents );
2.5.4 Overlapped I/O 모델
- 중첩 입출력
2.5.4.1 Overlapped I/O 모델 특징
- 비동기 데이터 송수신(동시에 여러개의 데이터를 송수신 요청 가능)
- 소켓 내부 버퍼를 사용하지 않고 TCP전송 버퍼에서 데이터 송수신(소켓 옵션 함수에서 내부 버퍼를 0으로 만들어 줌)
- 주의 : 데이터를 보낼 때는 작업이 완료되기 전에 버퍼를 삭제하면 안된다.
- SOCKET WSASocket(
int af,
int type,
int protocol,
LPWSAPROTOCOL_INFO lpProtocolInfo, //NULL(소켓생성프로바이더)
GROUP g, // 0 (소켓 그룹)
DWORD dwFlags ); //WSA_FLAG_OVERLAPPED(OverlappedI/O)
- int WSASend(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount, //WSABUF 개수
LPWORD lpNumberOfBytesSent,
DWORD dwFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionROUTINE );
- int WSARecv(
SOCKET s,
LPWSABUF lpBuffers,
DWORD dwBufferCount,
LPWORD lpNumberOfBytesSent,
LPDWORD lpFlags,
LPWSAOVERLAPPED lpOverlapped,
LPWSAOVERLAPPED_COMPLETION_ROUTIN lpCompletionROUTINE);
- WSAOVERLAPPED 는 내부적으로 사용되어지는 변수로 첫번째부터 네번째변수는 0으로 초기화 해야함(이상동작), hEvent는 완료를 알려주는 역할
- 반환값이 0이 아닐때 WSA_IO_PENDING은 즉시처리되지 않고 나중에 처리될 예정 그 외는 에러
2.5.4.2 Overlapped I/O - Event 모델
- WSAWaitForMultipleEvents() : 이벤트 발생 감지
- BOOL WSAGetOverlappedResult(
SOCKET s,
LPWSAOVERLAPPED lpOverlapped,
LPDWORD lpcbTransfer,
BOOL fWait, //Overlapped I/O 작업이 완료할때까지 대기 여부(FALSE)
LPDWORD lpdwFlags );
: 작업 완료 이벤트 발생 소켓에서 작업 결과를 갖고온다.
2.5.4.3 Overlapped I/O - Callback 모델
- 작업완료 통보를 콜백함수 호출
- void CALLBACK CompletionROUTINE(
DWORD dwError,
DWORD cbTransferred, //처리바이트수(실패:0)
LPWSAOVERLAPPED lpOverlapped,
DWORD dwFlags );
2.5.4.4 I/O Completion Port 모델
- 윈도우 모델에서 최고성능
- Windows NT 4.0 이상
- Overlapped I/O + Thread Pooling
- 쓰레드 풀 : 여러 쓰레드를 미리 대기상태로 생성 해 놓음
- 쓰레드 생성/소멸 에 따른 cpu 소모 줄임
- Context Switching 을 줄임
- CreateIoCompletionPort()
- IOCP Queue
- WaitngThread Queue : LIFO (Context Switching을 줄이기 위함)
- HANDLE CreateIoCompletionPort(
HANDLE FileHandle,
HANDLE ExistingCompletionPort,
ULONG_PTR CompletionKey,
DWORD NumberOfConcurrentThreads );
: CompletionPort 커널 객체 생성, CompletionPort 커널 객체와 소켓을 연결
: 생성시에는 마지막 인자만 사용 (0 : cpu개수와 동일하게 설정)
CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, NULL, NULL, 2);
: 연결시에는 첫번째(CompletionPort와 연결될 소켓핸들), 두번째(생성된 CompletionPort 객체), 세번째(어떤 소켓인지 구분하기 위한 고유값), 네번째(0:무시)
- BOOL GetQueuedCompletionStatus(
HANDLE CompletionPort,
LPDWORD lpNumberOfBytes,
PULONG_PTR lpCompletionKey,
LPOVERLAPPED* lpOverlapped,
DWORD dwMilliseconds );
: 실패시 FALSE 반환 : lpNumberOfBytes가 0이면 소켓이 닫힘
: 세번째 인자는 CreateIoCompletionPort에서 넣어 주었던 값
- BOOL PostQueuedCompletionStatus(
HANDLE CompletionPort,
DWORD dwNumberOfBytesTransferred,
ULONG_PTR dwCompletionKey,
LPOVERLAPEED lpOverlapped );
: 사용자가 인자로 넣어준 정보를 IOCP Queue에 추가
'프로그래밍 > 네트워크' 카테고리의 다른 글
| IOCP 관련 팁 (0) | 2009/12/28 |
|---|---|
| [온라인 게임 서버]2장 온라인 게임 서버(기초편) (0) | 2008/11/19 |
| [온라인 게임 서버]1장 온라인 게임 서버(시작편) (0) | 2008/11/18 |
| [온라인 게임 서버]목차 (0) | 2008/11/18 |
댓글을 달아 주세요