190712-4 - IOCP 모델 비동기 입출력을 쉽게 할 수 있는 객체를 만들었다. // 입출력 완료 포트 생성 HANDLE hcp = CreateIoCompletionPort( INVALID_HANDLE_VALUE, NULL, 0, 0);//- 첫 번째 인수가 -1이면 ICOP 오브젝트를 생성 if(hcp == NULL) return -1; // 소켓과 입출력 완료 포트 연결 HANDLE hResult = CreateIoCompletionPort((HANDLE)client_sock, hcp, (DWORD)client_sock, 0); // 첫 번째 인수가 IOCP인수를 가지면 IOCP와 해당 소켓을 연결한다. //키=소켓번호 로 설정, 0 = 스레드를 전부 깨운다. if(hResult == NULL)..
190712-3 Overlapped 모델 동기 : 비동기 : 완료보고를 받고 동작을 처리해야한다. 닷넷에가면 비동기 델리게이트로 구현되어있다. // 소켓 정보 저장을 위한 구조체 struct SOCKETINFO { WSAOVERLAPPED overlapped; SOCKET sock; char buf[BUFSIZE+1]; int recvbytes; int sendbytes; WSABUF wsabuf; // 전송할 데이터의 크기와 버퍼의 주소값이 포함되는 구조체 (WSAsend함수에필요) }; // 더미(dummy) 이벤트 객체 생성 WSAEVENT hEvent = WSACreateEvent(); if(hEvent == WSA_INVALID_EVENT) err_quit("WSACreateEvent()"); ..

190712-2 WSAEventSelect // WSAEventSelect() retval = WSAEventSelect(listen_sock, EventArray[nTotalSockets-1], FD_ACCEPT|FD_CLOSE); OS에 알려준다. 임의의 소켓을 대상으로 이벤트 발생여부를 관찰하도록 한다. // 이벤트 객체 관찰 index = WSAWaitForMultipleEvents(nTotalSockets, EventArray, FALSE, WSA_INFINITE, FALSE); 단 하나라도 이벤트 발생시 리턴한다.

190712-1 WSAAsyncSelect 윈도우 에서 제공하는 모델이다. 서버를 중심으로 모델을 공부해보자. ● WSAAsyncSelect : 윈도우 메세지 기반의 모델이다. 쓰레드가 없다. 프라이머리스레드를 사용한다. 프라이머리 스레드는 UI에 대한 처리를 하자고 약속되어있다. 그래서 경고가 뜬다. -> WSAEventSelect를 사용하는 것을 권장하도록한다. 기능수행방식(?) 플레그 방식 완료보고 방식 Blocking IO select Overlapped IO 쓰레드 WSAAsyncSelect IOCP WSAEventSelect ● 차이점 기능수행방식(?) 먼저 함수를 호출해서 기능을 수행한다. (함수 반환시 완료다.) 플레그🏁 방식 OS가 알려준다.(깃발을 드는 방식) (Message, Even..
190711-2 - SELECT 모델 SELECT 모델 쓰레드 하나로 다중처리를 할 수 있다. // 소켓 정보 저장을 위한 구조체 struct SOCKETINFO { SOCKET sock; //소켓번호 char buf[BUFSIZE+1]; //버퍼 int recvbytes; //받은바이트 int sendbytes; //보낸바이트 }; 소켓 마다 독립적으로 관리하기 위해서 구조체 정의. SOCKETINFO *SocketInfoArray[FD_SETSIZE]; // 소켓정보포인터를 저장하는 배열 (FD_SETSIZE : 현재 64개) // 넌블로킹 소켓으로 전환 u_long on = TRUE; retval = ioctlsocket(listen_sock, FIONBIO, &on); if(retval == SO..
190711 - Study 비동기 IO가 사실상 Overlapped(중첩된) IO나 다름없다. IO 중첩 : 하나의 쓰레드에서 둘 이상 영역으로 데이터를 전송. 윈도우에서는 IO가 완료된 상황 확인방법에 포커스를 맞춘다. 넌-블로킹 모드로 IO를 하면 이후 완료결과를 별도로 확인하는 작업이 필요하다. SOCKET WSAAPI WSASocketA( int af, //프로토콜 체계 정보 int type, // 데이터 전송방식 int protocol, LPWSAPROTOCOL_INFOA lpProtocolInfo, GROUP g, // 예약변수 DWORD dwFlags ); ● Overlapped IO 소켓 생성 WSASocketA(PF_INET, SOCK_STREAM, 0, NULL, 0, WSA_FLAG_..
190711 파일입출력, 클라->서버 (파일저장) 본 글은 교육을 받으며 정리한 내용을 그대로 올린 것 입니다. ● File IO 개행을 표시할 때 \r : 캐리지 리턴(CR) (다시 앞으로 땡기는 작업) \n : 라인 피드(LF) (타자기계에서 위로 올리는 작업) 파일 저장시 위 두개를 모두 해야한다. \r\n으로 저장을 해야한다. ABC BCD = ABC\r\nBCD\r\n 으로 저장이되어 모두 10byte로 저장된다. 1.텍스트모드 텍스트 모드는 자동으로 위(\r\n)을 변환시켜준다. 즉 \n과 \r\n의 관계다. 로그파일 만들 때 많이 쓴다. 2.바이너리모드 데이터를 저장할 목적으로 사용된다. 주로사용. 읽어온 만큼 다시 그대로 저장하려면 바이너리모드를 쓴다. ● 파일 IO를 하는 이유 2가지 1..
190710 - Study - 비동기 Notificaion IO 모델 본 글은 교육을 받으며 노트필기한 내용을 그대로 올린것 입니다. 비동기 Notification IO 모델 구현 방법 2가지 1. WSAAsyncSelect() 사용 : 발생한 이벤트를 수신한 위도우의 핸들 지정 필요. 2. WSAEventSelect() 사용 : ● WSAEventSelect : 임의의 소켓을 대상으로 이벤트 발생여부를 관찰하도록 한다. 이벤트 발생 유무에 관계없이 바로 반환한다. int WSAAPI WSAEventSelect( SOCKET s, WSAEVENT hEventObject, long lNetworkEvents ); ● manual-reset 모드이면서 non-signaled 상태인 Event 오브젝트가 필요..
190710 본 글은 교육을 받으면 노트필기 했던 내용을 그대로 올린내용입니다. #include // 윈도우즈 헤더보다 앞서서 정의한 것이 많다. 주의. 가장 (windows.h)위에 작성 // Windows.h 에서 이전 버전의 winsock.h 을 포함 시키기 떄문에 충돌이 난다. #include #include int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpszCmdLine, int nCmdShow) { WSADATA wsa; if (WSAStartup(MAKEWORD(2, 2), &wsa) != 0) return -1; WSACleanup(); return 0; } 다이얼로그 베이스 기반 #include #incl..
190709 교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다. 다중 처리 에코 서버를 구현해보자. 대기 소켓 스레드 1개, 통신 소켓 스레드 2개 (수신, 발신)가 필요하다. 이때 대기 소켓 스레드는 프라이머리 스레드가 수행하도록 하고 통신 소켓 스레드는 서브 스레드가 처리하도록 구현할 것이다. peer : 통신에 참여하는 엔드시스템 getpeername(sock, (SOCKADDR*)& clientaddr, &addrLen); getpeername() : 원격 IP, 포트번호 얻기 getsockanme() : 로컬 IP, 포트번호 얻기 SOCKADDR : 옛날꺼 SOCKADDR_IN 데이터의 경계 만들기 1. markup : 끝나면 #(표식)을 붙여줌, EOR(End of record) ..