![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/KKkI8/btqymVyQJwO/YkeKjyhVdEW5w7YGlFOXI0/img.png)
190712-2 WSAEventSelect // WSAEventSelect() retval = WSAEventSelect(listen_sock, EventArray[nTotalSockets-1], FD_ACCEPT|FD_CLOSE); OS에 알려준다. 임의의 소켓을 대상으로 이벤트 발생여부를 관찰하도록 한다. // 이벤트 객체 관찰 index = WSAWaitForMultipleEvents(nTotalSockets, EventArray, FALSE, WSA_INFINITE, FALSE); 단 하나라도 이벤트 발생시 리턴한다.
![](http://i1.daumcdn.net/thumb/C148x148/?fname=https://blog.kakaocdn.net/dn/bcspLB/btqymVFFAov/1BuJJzh77W1pAp4lw0gklk/img.png)
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) ..
190708-1 1일차 교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다. TCP/IP 프로토콜로 윈도우즈에서 제공하는 네트워크 프로그래밍 방식을 공부한다. Windows Socket : 현재 비동기, 넌 블로킹을 위한 2.2가 주력. ● 네트워크는 end system이라고 부르는 컴퓨터 또는 하드웨어가 2개 이상 연결되어 있는 것을 말한다. 컴퓨터 사이에 통신가능하도록 2개이상의 장치가 연결된 것이다. ● 프로로토콜 : end system과 (라우터간 등)통신을 위한 약속 ● 컴터는 모두 1대 1로 연결되있다. 기본적으로는 1대 1만 통신이 가능하다. 네트워크가 1대 1로 맞물려 이는 것을 로컬 네트워크라고한다. ● 출발위치 목적지를 실어서 데이터를 보낸다. ● 라우터, 게이트웨이 ● OS..
190705-4 - _DLLPRE extern "C" __declspec(dllexport), __declspec(dllexport) void Print(int a, int b) 교육을 받으면서 노트필기 했던 내용을 날것 그대로 업로드합니다. 라이브러리 다이나믹 링크 라이브러리(DLL) : 실행시간에 결정 스테틱 링크 라이브러리(LIB) : 빌드 A.c B.c (텍스트 레벨) 컴파일 작업 : A.obj , B.obj (바이너리 레벨) 링크 작업 EXE 생성. (.lib 가 포함) -> 동일한 라이브러리를 포함해서 사용하는 문제가 있을 수 있다. DLL 이라는 개념을 만들어낸다. 우선은 static lib 부터 해보자. 라이브러리 : 컴파일완료된 바이너리 데이터 (함수 등의 집합이다.) 라이브러리 제공자 ..