본문 바로가기

Network

IOCP model(Chat Server) - Code SockIOCP.h #pragma once #include #pragma comment(lib,"ws2_32") DWORD WINAPI ThreadCompletion(LPVOID pParam); typedef struct _USERSESSION{ SOCKET hSocket; SOCKADDR_IN clientAddr; }USERSESSION; typedef struct _PERIODATA{ OVERLAPPED ov; WSABUF wsabuf; char buffer[1024]; bool isRecv; }PERIODATA; class SockIOCP { public: SockIOCP(void); ~SockIOCP(void); public: HANDLE m_hIOCP; int m_nThreadCount; SOC.. 더보기
IOCP model(Server) - Idea Overlapped IO 개념: 기본적으로 IO는 동기방식이다. ReadFile()하면 디스크에서 파일이 다 읽어질때까지 CPU는 대기한다. 이게 성능저하를 초래하기 때문에 비동기로 IO를 처리하는 방법인 Overlapped IO이다. 비동기로 여러번 데이터를 전송하면 데이터 전송이 중첩된다는 의미로 Overlapped형태라고 한다. 원리: 비동기 방식으로 WSASend()를 호출하면 이 IO처리의 책임이 쓰레드에서 Device Driver로 넘어간다. 즉 IO처리는 Driver가 담당하고 쓰레드는 다른 작업을 계쏙 진행할 수 있다는 것이다. Device Driver는 IO처리가 끝나면 이를 다시 쓰레드에 알려줘야 하는데 OVERLAPPED 구조체에 있는 이벤트 객체를 통해서 알려주기도 하고 아니면 지정.. 더보기
Basic model(Chat Client) - Code ConsoleChatClient.cpp #include "stdafx.h" #include #pragma comment(lib,"ws2_32") DWORD WINAPI ReceiveThread(LPVOID pParam) { //무한 수신을 해야한다. 종료되지 말고. SOCKET hSocket = (SOCKET)pParam; char szBuffer[32] = {0,}; while(1) //종료되지 말아야 하니까 while루프.. { memset(szBuffer,0,sizeof(szBuffer)); ::recv(hSocket,szBuffer,sizeof(szBuffer),0); //여기도 recv함수가 블라킹이니까 한번 받고 한바퀴 돌고 다시 대기 printf("From Server: %s\n", szBu.. 더보기
Basic model(Client) - Idea WSAStartup(): 윈속 초기화 함수 WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수. WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수. socket(): 소켓 생성 함수 소켓을 생성하고 사용할 프로토콜을 지정한다. SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다. bind(): src ip와 port 설정 Client는 서버와 달리 일반적으로 bind()를 호출하지 않는다. 그러면 OS가 자동으로 src ip와 port를 지정해준다. 다만 Client도 특별한 경우 src ip와 port를 지정하고 싶다면 bind()를 호출하면 된다. connect(): 서버로의 연결 시도.. 더보기
Basic model(Server) - Idea WSAStartup(): 윈속 초기화 함수 WSAStartup(): WS2_32.DLL을 메모리에 로드(초기화) 하는 함수. WSAClenup(): 윈속 함수 사용중지를 알리고 리소스를 반환하는 함수. socket(): 소켓 생성 함수 소켓을 생성하고 사용할 프로토콜을 지정한다. SOCKET은 일종의 HANDLE값이며 포인터이다. socket discriptor라고 부르며 32bit정수값이다. bind(): 소켓의 local IP주소와 local port를 지정한다. int bind(SOCKET s, const struct sockaddr *name, int namelen); 함수 사용. 두번째 인자는 SOCKADDR_IN 구조체에 값을 담아 SOCKADDR*형으로 캐스팅하여 전달한다. listen():.. 더보기