안녕하세요, 비동기, 논블록 환경의 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 감사합니다 :)
왜 오류가 발생하는지 이해가 가질 않습니다. GameServer.cpp에서 db내용 넣는부분과 추출하는부분만 확인하려고 return 0; 을해서 바로 빠져나왔는데요 DBConnectionPool이 소멸되는 시점에 Clear 해주는데 이때 WRITE_LOCK을잡으려하는데 Lock이 없어지는 거같습니다 코드 그대로 복사해봐도 동일한 오류가 나오는데 이유가 있을까요? main에서 return을 중간에해서 종료하는건 지금만든 서버 에서는 할필요가 없을거 같긴한데요 찝찝한 느낌이 있어서 질문 드립니다..
main쪽 ready=false로 둔 상태에서 t1을 먼저 만드는데, t1이 생성된 후 t2가 만들어지기전에 ready를 true로 하지말아줘 이런 목적일까요?? 쓰레드 생성 후 ready = true를 무시하고 바로 ready에 true를 넣으면 어떤문제가 발생하는 걸까요?
안녕하세요, 좋은 강의 만들어주셔서 큰 도움이 되고 있습니다. WSAECONNRESET의 경우 클라이언트 쪽에서 강제로 연결을 종료했을 때 발생하는 것 같은데, WSACONNABORTED는 언제 발생하는 것인가요? MS 도큐먼트나 구글을 열심히 뒤져도 설명만으로 잘 이해가 안되서 질문드립니다.
안녕하세요 루키스님 질문 게시판을 보다가 루키스님이 주말마다 클라이언트 연동 강의를 진행하고 계시고 마무리 단계라는 글을 봤습니다. 강의 출시 예정이 6개월~1년 텀을 두고 오픈한다고 하셨는데 혹시 더 빠르게 출시하실 생각은 없으신가요?ㅠㅠㅠ 대학교 졸업 작품을 언리얼을 사용해서 작업하기로 했는데 서버랑 연동하는게 생각보다 어려워서요. 그리고 루키스님 강의에 유니티 서버 연동강의가 있는데 그걸 봐도 언리얼에서 연동을 어느 정도 작업을 할 수가 있을까요?
디버깅을 해보니 GameSession.cpp의 전역으로 선언한 GSessionManager가 가생성 될때 Set<GameSessionRef> _sessions; 멤버 변수로 선언한 STL Allocator 의 Set을 만들어야 하는데 코어 글로벌이 아직 만들어지지 않은 상태 같습니다. 제 생각으론 코어 라이브러리 보다 GameServer프로젝트가 먼저 실행되는듯 보입니다.. 이런경우는 처음이라 어떻게 해결해야 하는지 난감하네요...
안녕하세요 루키스님 qna 게시판을 보다가 루키스님이 주말마다 언리얼 클라이언트 연동 강의를 주말마다 진행하고 계신다는 글을 봤는데 혹시 멘토링으로 진행하시는 건가요? 만약 진행 중이시라면 지금이라도 참여할 수 있을까요? 강의로 촬영하고 계신 거면 언제쯤 출시되는지 궁금합니다.
acceptex 함수를 사용하면 accept 쓰레드를 하나 만들어서 사용하는 거에 비해서 확실하게 성능 이득을 보는편인지 궁금합니다. 제 생각은 그렇게 차이가 심하게 날거라고 생각이 안 들거든요. 왜냐면, acceptex를 사용하면 그만큼 IOCP WorkThread 부담을 줄거라고 생각이 들고요, 그리고 소켓 풀로부터 어느 만큼 미리 만들어서 등록을 시켜줘야할지도 관건이 되겠고.. 결국 그 소켓 풀로 만드는 것도 풀이 비어 있으면 만드는 비용도 들어서 그렇게 큰 기대 효과를 못 볼거라고 생각이 들어서요. 그래서 결국 accept만 하는 스레드를 따로 빼서하는 것도 괜찮은 방법이라고 생각이 들거든요. 이 부분에 관해서 어떻게 생각을 하시는지 궁금합니다.
IncreaseHeadCount 부분에서 CountedNodePtr newCounter = _oldCounter 를 해주는데 newCounter 같은 경우 지역변수이기 때문에 애초에 경합이 발생할 수 없지 않나요? int 변수를 공유하는 것도 아니고 완전히 새로운 지역 변수이기 때문에 좀 이해가 안됩니다. 오히려 oldCounter를 바꿔주기 위해서 head.compare _exchange_strong을 하는거 아닌가요?