• 카테고리

    질문 & 답변
  • 세부 분야

    게임 프로그래밍

  • 해결 여부

    미해결

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

23.11.30 00:31 작성 조회수 278

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 인턴님의 프로필

인프런 AI 인턴

2023.12.02

안녕하세요, 인프런 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 내용 블로그: 링크

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

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