본문 바로가기

게임서버(Game Server)

[게임서버] AcceptEx와 ConnectEx

AcceptEx란

WSASend()와 WSARecv() 같은 비동기 입출력 함수의 송수신 완료 통지를 IOCP에서 받을 수 있다.

하지만 accept()와 connect() 함수는 IOCP를 이용해서 완료 통지를 받을 수 없었다.

이러한 문제를 해결하기 위해 MS(Micro Soft)에서 XP부터 확장 API를 제공했는데 그게 바로 AcceptEx()와 ConnectEx() 함수이다. 이 두 함수는 비동기 입출력 방식으로 작동하는 함수이며 AcceptEx()는 accept와 차이는 AcceptEx()는 미리 두개의 소켓, 리슨 소켓과 접속을 받을 소켓을 미리 준비해야 한다는 점이다. 

 

 

AcceptEx 사용법

AcceptEx를 사용할 수 있는 방법은 두 가지가 있다.

 

1. AcceptEx() 함수를 사용

     AcceptEx() 함수의 원형은 다음과 같다.


2. WSAloctl() 함수에 LPEN_ACCEPTEX 함수 포인터를 넣는 방법

     WSAloctl()은  소켓의 모델은 컨트롤할 수 있는 함수이다.

WSAIoctl()에 넣었던 LPFN_ACCEPTEX 함수 포인터 변수를 위의 AcceptEx() 함수를 사용하듯이 사용하면 AcceptEx()를 사용할 수 있다.

 

lpvInBuffer 매개변수에 원하는 확장 API의 함수 포인터를 식별하는 GUID를 지정한다. 밑에 표는 GUID와 관련된 함수이며 더 많고 자세한 것은 참고에 있는 책을 참고하면 좋다.

 

ConnectEx란

ConnectEx는 클라이언트에서 서버로 접속할 때 사용하는 connect 함수의 비동기 버전이다. 

 

 

ConnectEx 사용법

ConnectEx는 AccpetEx의 두 번째 사용방법과 동일한 방법으로 하면 된다.

 

 

Connect와 차이는 다음과 같다.

  • 첫 번째 매개변수인 소켓 s는 ConnectEx에서 호출되기 전에 반드시 바인드 되어야 한다.
  • 접속과 동시에 원하는 데이터를 전송할 수 있다.
  • 비동기로 움직이며, 소켓 s를 시그널 객체로 사용하거나 IOCP에 연결할 수 있다.

후기

비동기 입출력 함수인 AcceptEx와 ConnetEx에 대해서 공부해보았다. 이전까지 IOCP 서버를 사용할 때에는 

accpet() 동기 함수에 따로 accpet 용 스레드를 만들어서 처리를 했었는대 AccpetEx 비동기 입출력을 사용하기 때문에 필요가 없으며 ConnectEx 또한 서버에서 사용할 일은 거의 없다고 생각하지만 서버와 서버끼리 연결하는 분산서버 구조에서는 사용하기 용이해 보인다.

 

이다음에는 이 두 함수를 이용한 간단한 CS(Client-Server) 구조를 해볼 예정이다.

 

출처 및 소스코드 링크

ConnectEx: www.docs.microsoft.com/ko-kr/windows/win32/api/mswsock/nc-mswsock-lpfn_connectex

WSAIoctl: www.docs.microsoft.com/en-us/windows/win32/api/winsock2/nf-winsock2-wsaioctl

AcceptEx: www.docs.microsoft.com/ko-kr/windows/win32/api/mswsock/nf-mswsock-acceptex?redirectedfrom=MSDN

Book: 윈도우시스템 프로그램을 구현하는 기술