개발 서적 리뷰/게임서버 프로그래머 책(10)
-
[게임서버프로그래밍#6] 클라이언트-서버 구현을 위한 소켓 기초 정리
이 글에서는 소켓 통신의 기초부터, Blocking/Non-Blocking 구조, Winsock2 함수(ioctlsocket, getsockopt, select) 사용법, 클라이언트-서버 프로그램 기본 흐름까지 실제 코드 예제와 함께 설명한다. 소켓(Socket)이란 무엇인가소켓은 네트워크 연결을 제어하는 핸들이다.파일 핸들처럼 읽고 쓰기를 담당하지만 대상이 네트워크다. Blocking 통신 구조Blocking 통신은 소켓 함수 호출 시 완료될 때까지 대기하는 구조를 의미한다.* 클라이언트 Blocking 흐름socket() : 소켓 핸들 생성bind() : 클라이언트 포트 설정connect() : 서버 연결 (연결 완료될 때까지 대기)send() : 송신 버퍼에 데이터 저장 (버퍼가 꽉 차면..
2025.04.29 -
[게임서버프로그래밍#1] 서버 분산 처리
이 글에서는 서버에서 분산처리를 수행하는 두 가지 주요 방식인 기능적 분산처리와 데이터 분산처리를 설명한다.각각의 특징, 장단점, 구체적 예시를 함께 다루며, 암달의 법칙이 분산처리 효율성에 미치는 영향까지 살펴본다. 분산처리란 무엇인가서버 시스템이 커지면서 하나의 서버만으로 모든 요청을 처리하는 데 한계가 생긴다. 이를 해결하기 위해 작업을 여러 서버에 나누어 처리하는 방법을 분산처리라고 한다. 분산처리에는 기능적 분산처리와 데이터(수평) 분산처리 두 가지 주요 방법이 있다. [ 기능적 분산처리 ]정의:서버의 기능 단위를 나누어 각각 다른 서버가 담당하도록 분리하는 방법이다. 예시:플레이어 관련 로직은 Player Server에서,몬스터 관련 로직은 Monster Server에서 처리한다.플레이어가 몬..
2024.06.14 -
[게임서버프로그래밍#2] RDBMS와 NoSQL
이 글에서는 데이터베이스의 두 가지 큰 흐름인 RDBMS와 NoSQL의 개념과 차이를 설명한다. 각각이 중시하는 원칙(ACID, BASE), 구조상의 차이, 분산처리(샤딩)까지 예시와 함께 살펴본다. 데이터베이스의 기본 개념 데이터를 효율적으로 저장하고, 변경하고, 조회하기 위해 사용하는 시스템을 데이터베이스(Database)라고 한다.데이터베이스는 크게 RDBMS(Relational Database Management System)와 NoSQL(Not Only SQL) 두 종류로 구분할 수 있다. RDBMS란 무엇인가 정의관계형 데이터베이스로, 데이터를 테이블(table) 형태로 저장한다.행(Row)과 열(Column)로 구성된 구조를 갖는다.**SQL(Structured Query Langua..
2024.06.13 -
[게임서버프로그래밍#4] Client-Server 기본 연결과 통신
이 글에서는 TCP 기반으로 클라이언트-서버 연결을 구현하는 기본 흐름을 설명한다.Winsock 초기화, 비동기 소켓 설정(ioctlsocket), select를 통한 이벤트 감지 등기본적인 소켓 프로그래밍을 단계별로 다룬다. 기본 통신 구조(Client와 Server는 각각 다음과 같은 순서로 동작한다)클라이언트(Client)소켓 생성 (socket)서버 주소로 연결 시도 (connect)데이터 송신 (send)데이터 수신 (recv)소켓 종료 (closesocket)서버(Server)소켓 생성 (socket)포트 바인딩 (bind)연결 대기 (listen)연결 수락 (accept)데이터 송신/수신 (send/recv)소켓 종료 (closesocket) 비동기 소켓 설정ioctlsocket()..
2024.06.08 -
[게임서버프로그래밍#3] Overlapped I/O
이 글에서는 Windows 환경에서 고성능 네트워크 통신을 위해 사용되는 Overlapped I/O를 설명한다.기존 비동기 방식의 한계를 보완하며, CPU 낭비를 줄이고 I/O 효율을 높이는 방법과 주의사항까지 구체적으로 다룬다. 비동기 처리 방식의 문제점기존 비동기 처리(select + socket + thread)에서는 다음과 같은 문제점이 존재한다.메모리 복사 비용:send() 같은 socket 내부 함수 호출 시 메모리 복사가 발생한다.불필요한 재시도 호출:송수신 버퍼에 1바이트라도 여유가 있으면 send()나 recv()를 호출하려 하지만, 실제로 데이터를 보내거나 받을 수 없는 경우가 발생한다.CPU 낭비:데이터를 보낼 수 없는 상황에서도 API 호출을 반복하면서 CPU 자원을 낭비하게 된다..
2024.06.04 -
[게임서버프로그래밍#5] 멀티스레드 Client-Server 구현 (feat: mutex, chrono)
이 글에서는 서버가 여러 클라이언트의 요청을 동시에 처리하기 위해 멀티스레드를 사용하는 방법을 설명한다. 멀티스레드 환경에서 발생하는 자원 충돌 문제를 막기 위해 mutex(뮤텍스)를 사용하고, 통신 타임아웃 처리를 위해 chrono를 적용하는 방법도 함께 다룬다. 멀티스레드가 필요한 이유하나의 서버 소켓이 다수 클라이언트와 통신할 때, 동시 접속 요청을 처리하려면 스레드가 필요하다.스레드를 사용하지 않으면 하나의 클라이언트 처리가 끝날 때까지 다른 클라이언트는 대기해야 한다. Thread 기본 개념스레드는 하나의 프로세스 안에서 독립적으로 실행되는 흐름이다.스레드들은 Heap 영역, 전역 변수, 파일 핸들 등을 공유한다.문제점:자원을 공유하기 때문에 여러 스레드가 동시에 같은 데이터에 ..
2024.06.02