본문 바로가기
게임 서버/게임 네트워킹의 이해

게임 네트워킹의 이해4 - 소켓 프로그래밍

by dragonDeok 2024. 9. 8.
728x90

소켓이란?


랜선 소켓(콘센트)이 있고 그 소켓에 랜선을 연결해서 정보나 데이터를 주고받는 것

소켓 프로그래밍이란?


  • 데이터 read / write 를 하는 IO Process다.

read / write는 크게 두 가지 방식으로 동기와 비동기 방식이 있다.

동기 방식


  1. 데이터를 read()하면 데이터가 올 떄까지 다른 동작을 하지 않고 읽기 위해 대기한다.
  2. 게임 서버에서는 여러 커넥션을 동시에 핸들링하기 때문에 하나의 데이터가 올 때까지 서버가 멈춰있으면 안된다.
    -> 그래서 read만 보내고 다른 작업을 처리하는 방식인 비동기 방식이 필요하다.

비동기 방식


  1. read()를 요청했으면 데이터가 오든 안오든 요청만 걸어놓고 다른 일하러 간다.
    다른 일하러 갔다와서 read()의 응답이 왔으면 그걸 처리한다.

비동기 방식은 크게 두 가지로 select, windows iocp, linux는 epoll이 있다.

1. select

  • pre request 방식
  • 자리가 비었는지 매번 확인하면서 비어 있어서 쓸 수 있으면 그때 가서 쓰는 방식
  • 일의 주체는 나인데, 내가 이 일을 할 수 있는지 없는지 계속 확인하는 방식
  • 구현이 간단

예를 들어 공중 전화기가 있고, 이걸 쓰고 싶은 사람이 여러 명 있다.
이들은 공중전화기를 계속 바라보고 있다. 다른 일을 처리하다가도 계속 공중전화기를 보고 언제 쓸 수 있나 확인한다.
이렇게 계속 확인하면서 다른 일 하다가 쳐다보고 다른 일 하다가 쳐다보다가 마침 공중전화기가 비어있으면 딱 들어가서 쓰는 방식이다.

2. iocp

  • post request 방식
  • 일의 주체가 내가 아니다. 다른 애(os)가 나를 위해 일을 해준다.
    나는 다른 애(os)한테 일을 맡겨놓고 딴 일 보러 간다.
  • 구현이 select보다 복잡하다.
  • window에서는 iocp가 성능이 잘 나온다.
  • 다른 애는 일을 한 다음에 나한테 그냥 일의 결과를 쌓아놓는다. ( 큐에 쌓아놓음 )
    나는 나중에 와서 큐에 일의 결과가 쌓여있나 확인한다.

택배를 보내고 싶은데 우체국에 담당 직원이 있고, 나는 택배가 오면 내 바구니에 넣어 달라고 요청한다.
이 택배가 올 때까지 기다리지 않고 나는 직원에게 부탁하고 다른 일 보러 간다.
다른 일 보고 와서 내 바구니에 택배가 와 있으면 그걸 가져간다.

select vs iocp


커넥션 수가 100개가 넘어가면 iocp를 쓰는 게 좋고, 100개가 안 넘으면 select도 사용해도 괜찮다.
최근 golang, java, .net에서는 라이브러리에서 네트워킹 기능을 잘 지원하기 때문에 내부적으로 iocp를 썼는지, select를 썼는지 잘 몰라도 코딩하는데는 문제 없이 짤 수 있다.