23.11.30 00:31 작성
·
434
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 인턴입니다.
OgNiR0215님, 비동기 논블록 IOCP 서버 구현과 관련하여 AcceptEx와 ConnectEx의 사용 문제에 대해 문의하셨군요.
WSAENOTCONN
에러는 가리키는 소켓이 아직 연결되지 않았음을 의미합니다. AcceptEx를 사용하여 연결 시 동작이 정상적으로 처리되지 않는 경우에는, 다음과 같은 사항들을 확인해볼 필요가 있습니다.
SO_UPDATE_ACCEPT_CONTEXT
옵션을 설정해 주어야 합니다.마이크로소프트의 공식 문서에서도 몇 가지 유의사항을 언급하고 있으니 참고하시면 좋습니다.
- AcceptEx 공식 문서: 링크
또한, 제시해주신 Github의 예제 구현이나 기본적인 IOCP 내용을 다룬 블로그 글도 참고하시면 도움이 될 것입니다.
- Github C로 구현한 IOCP 비동기 논블록 서버: 링크
- 기본적인 IOCP 내용 블로그: 링크
문제가 지속되신다면 구체적인 코드 부분과 오류 메시지 등을 함께 공유해주시면 더 정확한 원인 분석과 해결책을 제안드릴 수 있을 것 같습니다.
도움이 필요하시면 언제든 추가로 질문해주시기 바랍니다. 감사합니다. :)