목록분류 전체보기 (157)
Coding Memo
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 지난 번에는 WSASelect 모델을 이용해 Socket IO를 처리했었다. Select와 WSASelect는 결국 모두 Select를 활용하는 방법으로 동기 I/O 느낌이 강하게 든다. 이번에는 Overlapped에서 Event와 Callback 함수를 활용한 진짜 소켓 비동기 I/O 모델을 사용해볼 것이다. Overlapped I/O는 Asynchronous(비동기)처리의 Non-blocking 방식의 모델이다. 비동기+논블로킹의 방식은 callback 방식으로 호출을 하면서 callback의 형태로 다시 결과를 받는 방식이다. (Asynchronous) 물론, 이 때 다른 일을 처리할 수 있다.(non-b..
몇몇 게임을 하다보면, 그리고 게임을 만들려고하면 튜토리얼은 어떻게 구현하는 것일까에 대해 고민을 하게 된다. 내가 생각해낸 2가지 방법은 1. 튜토리얼 레벨을 완전히 따로 제작 2. 실제로 게임 플레이에 사용되는 실제 레벨에서 게임 진행 로직 일부 변경 및 튜토리얼용 UI 사용 이렇다. 3. (추가적으로) 게임 방법에 대한 튜토리얼을 따로 제작하지 않고 (간단한 게임의 경우) 게임 방법을 이미지로만 보여주는 방법(설명서 처럼?) 1번 방법은 특정 레벨이 복잡하거나 규모가 크게 구현이 되어있으면 조금 까다로울 수도 있다. 물론, 기존 레벨을 그대로 복사를 해놓고 일부만 변경해서 사용하는 방법도 있을 것이다. 아니면 게임을 즐기기 전에 매우 간단한 튜토리얼 레벨을 제작해도 될 것같다. 2번 방법은 다른 방..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 지난번에 사용했던 select의 단점으로는 1. 최대 개수가 얼마 안됨(64) 2. 매번 사용할 때마다 리셋하여 새로운 set을 만들어주어야함 이 있었다. 이번에는 WSAEventSelect를 사용하여 두 번째 단점을 해결할 수 있다. 소켓과 관련된 네트워크 이벤트를 이벤트 객체를 통해 감지한다. 먼저 WSAEventSelect 함수를 살펴보자. int WSAAPI WSAEventSelect( [in] SOCKET s, [in] WSAEVENT hEventObject, [in] long lNetworkEvents ); s: 이벤트를 확인할 소켓 hEventObject: 이벤트 오브젝트 (WSAEVENT) lNe..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. socket을 blocking모드와 non-blocking 모드로 사용할 때, 장단점이 각각 존재했다. blocking socket은 조건이 만족되지 않아서 blocking되는 상황이 발생하고 non-blocking socket은 조건이 만족되지 않아서 불필요하게 반복체크하는 상황이 발생한다. 그렇다면 반복체크를 계속하지 않고 non-blocking으로 해당 함수의 return 값을 받아서 사용할 수 없을까? 이에 대한 해답은 여러가지가 있는데, 그 중 하나가 select를 이용하는 것이다. select는 non-blocking(synchronous) 수행을 위해 여러개의 소켓을 관리하고 return 가능한 소..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 지금까지 했던 socket은 blocking으로 작동하는 소켓이었다. accept : 접속한 클라이언트가 있을 때 connect : 서버가 접속에 성공했을 때 send, sendto : 요청한 데이터를 sendBuffer에 복사 했을 때 recv, recvfrom : recvBuffer에 도착한 데이터가 존재하고, 이를 유저레벨 buffer에 복사했을때 다음 코드가 실행이 된다. 다시 말해, 위 조건이 실행되거나 에러가 발생할 때까지 다음 코드 실행은 block되는 것이다. 곰곰히 생각해보면 서버를 실행할 때 어떤 송수신이나 connect에 대한 응답을 무한히 대기하여 block된 상태로 있을 수는 없을 것이다..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. socket을 만들고 이 소켓에 대한 여러가지 세팅을 해줄 수 있다. 다음의 함수를 이용한다. setsockopt() int setsockopt( [in] SOCKET s, [in] int level, [in] int optname, [in] const char *optval, [in] int optlen ); SOCKET s 설정을 할 타켓 소켓 int level 옵션이 정의될 레벨 (SOL_SOCKET 이용) int optname 설정할 옵션 이름 const char* optival 설정할 옵션의 값 int optlen 설정할 옵션의 값의 크기 char*로 옵션의 값을 받는 이유는 옵션에 대한 값을 여러가지..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. UDP(User Data Protocol)은 네트워크 5계층에서 Transmission Layer에 해당하는 프로토콜 중 하나의 방식이다. UDP는 다음과 같은 특징이 있다. 1. 연결을 위한 별다른 경로가 없다. 2. 송수신 여부를 확인하지 않는다. 3. 데이터 손실에 대한 조치가 없다. 4. 데이터 그램 단위로 데이터를 전송한다. 5. 속도가 상대적으로 빠르다. (TCP에 비해) 좀 더 자세히 보자면 1. 연결을 위한 즉, listening 할 소켓이 필요가 없다. 대신 connecting UDP가 있다. (즐겨찾기와 비슷) 2. 직접적인 연결을 송수신 자간에 따로 하지 않고 송수신 여부도 따로 확인하지 않..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. TCP (Transmission Control Protocol)은 네트워크 5계층에서 Transport Layer에 해당하는 송수신 간 전송 방식 중 하나이다. 보통은 UDP와 대조되어 사용된다. TCP는 다음과 같은 특징을 가지고 있다. 1. 데이터 전송 경로 외에도, 호스트 간 연결이 따로 필요하다. 2. 송수신데이터에 대한 데이터의 경계(Boundary)가 없다. 3. 전송 순서가 보장된다. 4. 전송 시, 데이터 손실이 발생할 경우 다시 전송한다. (신뢰성이 있다.) 5. 데이터를 받을 호스트가 여건이 안될 경우 데이터를 일부만 전송한다. (흐름/혼잡제어) 6. 위 특징에 따라 고려할 것이 많으니 속도가..