목록Game Server (C++) (18)
Coding Memo
각 용어의 정의를 간단히 설명 하자면... (요약) Atomic: 말그대로 원자성이란 뜻으로 Atomic 명령 실행 중에는 다른 어떤 간섭 없이 끝까지 실행됨을 보장 Lock: Multi-Thread 환경에서 여러 쓰레드가 공유하는 어떤 리소스(변수 등)에 접근하는 방법에 대한 메커니즘 Critical Section: Multi-Thread 환경에서 상호 배제를 보장하는 특정 구역(section) 공유 리소스 접근 컨트롤이 필요한 이유 아래 코드를 살펴보자. int n = 0; void Thread1() { for (int i = 0; i < 100000; i++) { n++; } } void Thread2() { for (int i = 0; i < 100000; i++) { n--; } } int ma..
본 포스팅은 인프런에 등록되어 있는 Rockiss 님의 강의를 보고 간단하게 정리한 글입니다. 이전에 나왔던 Select, Overlapped(event), Overlapped(callback)들은 장점도 있었지만 단점도 많은 기능이었다. 일반 비동기 호출: 매우 보기 불편해보이는 중첩 무한 반복문 Select: FD_SET 당 최대 64개 한정, 매번 set을 만들어줘야함, 완전한 비동기 방식이 아님, 성능 좋지 않음 WSAEventSelect: 한번에 소켓 64개 제한 Overlapped(event): 소켓과 이벤트를 1:1로만 대응시킴, 한번에 소켓 64개 한정(overlapped) Overlapped(callback): 매번 Alertable Wait 상태를 만들어야되는 시스템적 부담(OS에 의해..
본 포스팅은 인프런에 등록되어 있는 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..
본 포스팅은 인프런에 등록되어 있는 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. 직접적인 연결을 송수신 자간에 따로 하지 않고 송수신 여부도 따로 확인하지 않..