인프런 커뮤니티 질문&답변

OgNiR0215님의 프로필 이미지

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Completion Port 모델

AcceptEx, ConnectEx 사용에 도움을 받고 싶습니다.

23.11.30 00:31 작성

·

413

0


안녕하세요,

비동기, 논블록 환경의 IOCP 서버를 구현하고 있습니다.
문제는 AcceptEx, ConnectEx 호출 후 GetQueudCompletionStatus 를 호출하면 정상적으로 TRUE 의 값이 출력됩니다.


하지만 서버에서 AcceptEx 를 호출하고, 완료 통보를 받았다면 서버가 클라이언트 소켓을 받아야 하는데 정상적으로 처리 되지 않는거 같습니다.
위 문제에 대한 코드에서 어떻게 해결 방안을 받거나 선생님의 도움을 받을 수 있을까요?

왜냐하면 AcceptEx -> GetQueudCompletionStatus -> setsockopt 에서 AcceptEx 에 들어오는 소켓의 옵션을 설정해 주어야 한다고 마이크로 소프트 공식 문서에 써져 있는 것을 확인했습니다.

하지만 옵션을 바꿔주기 전에 accept 소켓이 연결되어야 하는 상태인데 WSAENOTCONN 의 오류를 반환 받았습니다.

하단 링크는 구글 드라이브 공유 링크입니다.
문제가 있는 솔루션입니다.

참고한 문서들은,

소켓 오류 : https://learn.microsoft.com/ko-kr/windows/win32/winsock/windows-sockets-error-codes-2

Github C 로 구현한 IOCP 비동기 논블록 서버 : https://github.com/YDYDWang/libiocpsocket/blob/master/sock.c#L335

기본적인 IOCP 내용 블로그 : https://narakit.tistory.com/m/category/Computer%20Science%20%EA%B8%B0%EB%B3%B8%20%EC%A7%80%EC%8B%9D/%EC%86%8C%EC%BC%93%20%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%B0%8D

AccpetEx 에 대한 마이크로 공식문서 : https://learn.microsoft.com/en-us/windows/win32/api/mswsock/nf-mswsock-acceptex

Link : https://drive.google.com/file/d/1s8na3xe-o5nPPb8W6xuLMdl27XRfNChQ/view?usp=drive_link

감사합니다 :)

답변 1

0

인프런 AI 인턴님의 프로필 이미지

2023. 12. 02. 00:37

안녕하세요, 인프런 AI 인턴입니다.

OgNiR0215님, 비동기 논블록 IOCP 서버 구현과 관련하여 AcceptEx와 ConnectEx의 사용 문제에 대해 문의하셨군요.

WSAENOTCONN 에러는 가리키는 소켓이 아직 연결되지 않았음을 의미합니다. AcceptEx를 사용하여 연결 시 동작이 정상적으로 처리되지 않는 경우에는, 다음과 같은 사항들을 확인해볼 필요가 있습니다.

  1. 소켓 초기화: AcceptEx를 사용하기 전 소켓이 올바르게 초기화되고 연결을 받을 준비가 되어 있는지 확인해보세요.
  2. AcceptEx 호출: AcceptEx가 정확한 파라미터를 가지고 호출되고 있는지 체크하세요.
  3. 소켓 옵션 설정: GetQueuedCompletionStatus가 TRUE를 반환한 이후, 반드시 setsockopt을 호출하여 필요한 소켓 옵션을 설정해주세요. AcceptEx에서 생성된 소켓에 대해 setsockopt을 호출하기 전에, SO_UPDATE_ACCEPT_CONTEXT옵션을 설정해 주어야 합니다.
  4. 오류 코드 분석: WSAENOTCONN 에러를 받았을 때, 추가적으로 반환되는 오류 코드를 통해 문제를 좁혀갈 수 있습니다.

마이크로소프트의 공식 문서에서도 몇 가지 유의사항을 언급하고 있으니 참고하시면 좋습니다.
- AcceptEx 공식 문서: 링크

또한, 제시해주신 Github의 예제 구현이나 기본적인 IOCP 내용을 다룬 블로그 글도 참고하시면 도움이 될 것입니다.
- Github C로 구현한 IOCP 비동기 논블록 서버: 링크
- 기본적인 IOCP 내용 블로그: 링크

문제가 지속되신다면 구체적인 코드 부분과 오류 메시지 등을 함께 공유해주시면 더 정확한 원인 분석과 해결책을 제안드릴 수 있을 것 같습니다.

도움이 필요하시면 언제든 추가로 질문해주시기 바랍니다. 감사합니다. :)