Web Server is Server that transfer HTML(HyperText Markup Language) based on HTTP(HyperText Transfer Protocol). Web Server make sentence using HTTP standard.
IOCP can process several clients request by IO Thread. IOCP can assign Threads to process after IO completed. That is, IO Information completed is enrolled to Kernel Object named Completion Port Object.
Accept Thread (=Main Thread)
1. generate Completion Port Object
hComPort = CreateIoCompletionPort(INVALID_HANDLE_VALUE, NULL, 0, 0) 2. connect Socket with Completion Port Object. CreateIoCompletionPort((HANDLE)hClntSock, hComPort, (DWORD)handleInfo, 0);
1. IO don't need to compose repetitive statement in comparison with 'select' Server Model
2. OS manage sockets as enrolling socket to CP(Completion Port) Object
3. IOCP can adjust Thread number to process IO. Thus IOCP can block performance deterioration according to context switching.
4. IOCP can efficiently use CPU because server don't wait IO completion.
1. Enroll Event Kernel Object to OS using WSACreateEvent() WSACreateEvent() is manual-reset mode event object creation function WSAEventSelect() - OS observe chage of IO according to 3th parameter state and notify user. Thus, this funtion mean that WSAEventSelect() connect event object and socket ※ WSAEventSelect(SOCKET s, WSAEVENT hEventObject, long lNetworkEvents) (1) 's' delivered socket generate event according to 'lNetworkEvents' delivered event (2) 'hEventObject' delivered handle change state into 'signaled'
ex) newEvent = WSACreateEvent(); if (WSAEventSelect(hServSock, newEvent, FD_ACCEPT) == SOCKET_ERROR) ErrorHandling("WSAEventSelect() error");
2. Socket have to connect Event Object as matching index value.
ex) hSockArr[numOfClntSock] = hServSock; hEventArr[numOfClntSock] = newEvent; numOfClntSock++;
3. Check whether or not event generation is true using WSAWaitForMultipleEvents()
ex) posInfo = WSAWaitForMultipleEvents(numOfClntSock, hEventArr, FALSE, WSA_INFINITE, FALSE); startIdx = posInfo - WSA_WAIT_EVENT_0; ※ 'posInfo - WSA_WAIT_EVENT_0' is event generation start index value
4. Check Event Object signaled one by one using WSAWaitForMultipleEvents()
ex) for (i = startIdx; i<numOfClntSock; i++) { int sigEventIdx = WSAWaitForMultipleEvents(1, &hEventArr[i], TRUE, 0, FALSE);
5. Classify and event type using WSAEnumNetworkEvents()
ex) WSAEnumNetworkEvents(hSockArr[sigEventIdx], hEventArr[sigEventIdx], &netEvents);
6. Process event generated
FD_ACCEPT : Do exist connect request?
FD_READ : Do exist data recevied?
FD_CLOSE : Do exist disconnect request?
ex) if (netEvents.lNetworkEvents & FD_ACCEPT) // process content if (netEvents.lNetworkEvents & FD_READ) // process content if (netEvents.lNetworkEvents & FD_CLOSE) // process content Source Code
As using Multiplexsing,
One server can receive messages which Clients sended. Also, It is efficient about resource because one process processes clients's connect request.
Caution
MultiProcessing unconditionally isn't inefficient. It depends on the situation.