inflearn logo
강의

강의

N
챌린지

챌린지

멘토링

멘토링

N
클립

클립

로드맵

로드맵

지식공유

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

Completion Port 모델

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

651

OgNiR0215

작성한 질문수 3

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

감사합니다 :)

네트워크 MMORPG windows-server

답변 1

0

인프런 AI 인턴

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

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

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

Memory Pool에서 오버플로우 질문입니다.

0

63

2

포토폴리오 및 진로 관련하여 고민입니다.

0

112

1

포토폴리오 관련 고민입니다.

0

62

1

실무에서도 alloc, 스마트포인터 등을 구현해서 쓰는지 궁금합니다.

0

82

2

성능 테스트 결과

0

103

2

게임 서버 Stateful, Stateless 진로 고민

0

121

1

WaitOnAddress와 Sleep의 차이 질문

0

83

1

궁금한거 있습니다.

0

82

2

JobTimer 구동 스레드

0

107

2

TryPop() 동작 관련 질문

0

81

1

로드맵 C#서버 C++서버 방향성 질문

0

148

2

스레드 id를 출력할떄 메인스레드 id도 출력되나요?

0

73

1

생명주기를 위한 의도적 복사

0

86

2

락프리의 실무에서 사용 질문

0

139

2

32bit threadID와 16비트 상위 WriteFlag에 대해

0

101

2

mutex와 sleep 차이점

0

117

1

실무에서는 어떠한 코드 스타일을 사용하는지 궁금합니다

0

152

2

Stomp Allocator의 Release함수에 대한 질문입니다.

0

96

1

공부법 관련해서

0

183

2

MakeShared 함수 관련

0

114

1

지금까지 서버코어에서 만든 내용에 대해 궁금한 점이 있어서 질문 드립니다.

0

144

2

운영체제관련 질문입니다

0

131

1

send하려는 데이터 크기가 크면 memcpy에서 문제가 발생할 것 같습니다.

0

117

2

메모리 풀 질문있습니다.

0

124

1