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: 윈도우시스템 프로그램을 구현하는 기술
'게임서버(Game Server)' 카테고리의 다른 글
[게임서버] OSI 7계층 및 3-way, 4-way (0) | 2020.08.19 |
---|---|
[게임서버] Socket pool와 DisconnectEx-IOCP (0) | 2020.05.29 |
[게임서버] AcceptEx와 ConnectEx-IOCP (1) | 2020.05.14 |
[게임서버] 유니티(C#)에서 Pragma pack 사용법 (0) | 2020.04.12 |
[게임서버] 프로세스(Process)와 스레드(Thread) (0) | 2020.01.31 |