묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
섹션4 네트워크 라이브러리 제작의 IOCPCore부분에 질문이 생겨 글을 남깁니다.
서버가 받은 클라이언트 소켓의 아이피와 포트를 출력하고 싶어서 Listner의 ProcessAccept함수 안의 출력부분에 코드를 이렇게 짰습니다.//..................... wstring IpAddress = session->GetAddress().GetIpAddress(); uint16 port = session->GetAddress().GetPort(); cout << "Client Connected!aaa" << endl; wcout << IpAddress << port<<endl; //........................그런데 출력이 계속 Client Connected! 라고만 뜹니다. 문자열을 아무리 변경해도 계속 이렇게 뜨네요. 포트문제인가 싶어서 컴퓨터를 껏다키고 해보아도 여전히 Client Connected!라고만 뜹니다. 이유가 무엇일까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트 연동 질문입니다
안녕하세요현재 해당 강의 수강중에 궁금한 점이 있어서 질문드립니다제가 4인이 한 세션에 들어갈 수 있는 게임을 만들고자 하는데 (유니티로 제작할 예정입니다) 유니티 클라이언트에 로비 레벨이 있고 각 클라는 로비 레벨에서 매칭 신청을 하면 c++서버에서 매칭 신청 클라를 데디서버 프로세스를 띄우고 해당 데디서버를 통해 세션플레이를 진행하고자 합니다제가 유니티를 안해봐서 유니티에도 언리얼 데디서버 같은 기능이 있는지 혹은 직접 데디서버 역할을 하는 c# 프로그램을 구현해야하는 것인지 궁금합니다.rookiss님 유니티 강의에서 다루는 내용이 해당 내용을 포함하는지도 궁금합니다
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
atomic<uint32> _popCount 관련
안녕하세요. 궁금한 게 있습니다._popCount에 관해 질문이 몇 개 보이는데 좀 다른 내용이지만 저도 관련해서 질문합니다._popCount 변수가 Pop 함수를 실행하는 쓰레드 개수를 추적하는 것인데요, Pop함수를 실행하는 쓰레드의 개수가 아닌, Node* oldHead = _head;이 코드에서 얻게 되는 동일한 포인터를 참조하는 쓰레드의 카운트를 추적해야 하는게 아닌가 하는 의문이 듭니다. 이를테면 Pop을 실행하는 쓰레드가 한 50개가 있다고 하면 계속해서 _popCount는 1이 될 수가 없을 거 같은데요, 실제로 테스트 해봤는데 Delete 함수로 진입을 안 합니다. 제가 잘 못 생각하는 부분이 있을까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
공부 방향에 질문이 있습니다!
원래는 1년 전에 졸작을 만들기 위해 이 강좌를 참고하다가, 당시 수준으론 어려워서 대신 C# 강좌를 통해 유니티를 연동한 멀티플레이 VR 게임 졸작을 완성했습니다. 그러다가 이제 졸작 발표가 끝나고 현재 이 강좌를 보고 있는 중인데, 다만 오랜만에 찾아보니 [게임 프로그래머 입문 올인원]이라는게 있길래 같이 보는 중입니다. 그렇게 두 강좌를 같이 참고해서 보다 보니 이 강좌에서는[게임 프로그래머 입문 올인원] 에선 나오지 않는 여러 디테일한 내용들이 많은 걸 알 수 있었습니다. 일단 졸작에서 C# 서버를 만들어본 덕분인지 MSDN 문서를 참고하면 대충 강좌를 보지 않아도 서버 틀은 만들 수 있게 되었는데, 사실 이 강좌에서 나오는 디테일한 내용들은 여전히 머리가 빙빙 도는 상황입니다. 정확히 말하면 [게임 프로그래머 입문 올인원]의 서버는 어느정도 혼자 할 수 있을거 같은데,이 강좌에서 나오는 디테일한 내용을 혼자 채워넣으려고 하면 힘들다고 해야 할까요. 당장 데드락 사이클을 체크하는 내용만 봐도 알고리즘 공부를 다시 해야 한다는 걸 느끼는 중입니다. 원래 코테용으로 bfs나 dfs를 나름 공부하기는 했지만, 지금 지식으로는 저런 내용을 혼자 만드는 건 엄두가 나질 않습니다. 아무튼 감사하게도 일단 루키스님의 강좌가 있으니 지금은 이걸 보면서 공부하면 되는 것인데, 나중에 취업을 하면 강좌에 나오지 않은 다른 디테일한 내용들은 어떻게 공부를 해야 하는 걸까요? C# 강좌의 마지막에서 나오는 여러 기법들이나 해킹 관련 이슈의 대처법 같은 건 지금처럼 혼자 만든다고 터득할 수 있는게 아닐텐데 말입니다.아니면 취업후에도 따로 학원을 다녀야 하는 걸까요?만약 다닌다면 학원에서 어느정도의 내용을 배울 수 있는 건가요? 루키스님 강좌를 들어보면 중간에 서버 학원에 대한 간략한 언급들이 있던데 말입니다.일단 다음 학기를 마지막으로 졸업인지라, 이번에는 언리얼 포트폴리오 제작을 위해, 다음 강좌가 나오기 전까지 혼자 언리얼이랑 서버 연동을 도전해보는 것도 좋아보여서 해보는 중에 의문이 들어 질문드립니다.
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
페이지 질문
메모리를 페이지 단위로 관리하신다고 하셨는데VirtualAlloc을 통해서 int를 따로 2번을 요청하게 되면 위에 그림처럼 int가 연속적으로 배치되는게 아니라 페이지 단위만큼 떨어지게 메모리가 배치가 되는건가요??만약에 저렇게 배치가 된다면 size를 그대로 넣지 않고 직접 구해서 넣는 이유가 뭔가요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Event Vs Condition_Variable
제목 그대로 Event와 Condition_variable의 차이가 단순히 Kernel 이냐 User Level이냐의 차이인지가 궁금합니다. CV에서는 조건을 추가해서 코드상으로 봤을 때, 깔금해지는 것은 알겠는데Event와 동일하게 Producer에서 Notify_one을 실행 하더라도 Consumer에서 바로 Lock을 잡지 못한다면 Producer가 한 번더 실행될 거같은데 이부분은 제가 이해를 못한건지 잘 모르겠습니다. 정리 -> cv를 이용해서 notify_one함수를 호출해도Producer에서 바로 Lock잡아버리는 상황이 발생하지 않나라는것. cv 장점 : 코드가 깔끔해지고, User_Level에서 동작한다. 다른것은 Event와 동일하다? 라고만 이해하면 되는지 궁금합니다.
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요 Client 를 WinAPI Project로 붙여보려고 하는데
Client의 생성된 Window창 x를 누르면 윈도우 창이 종료되지 않고 Client에서 굳이 Console창을 열어 마우스로 x를 눌러야지만 닫기는데 원인을 못찾겠습니다.. 혹시 짐작갈만한 원인이 있을까요?예상으론 Thread가 Join상태에서 끝나질 않아 발생하는 현상같은데 그럼 강제로 Thread로 생성해뒀던 무한Loop를 강제로 종료하는 방법을 작성해야할까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
쓰레드매니저 질문
... void ThreadManager::Launch(function<void(void)> callback) { LockGuard guard(_lock); _threads.push_back(thread([=]() { InitTLS(); callback(); DestroyTLS(); })); } ... --------------------------------------------- int main() { for (int32 i = 0; i < 5; i++) { GThreadManager->Launch(ThreadMain); } GThreadManager->Join(); }쓰레드 매니저 예제 코드의 일부인데요, 위 코드에서 다음과 같이 InitTLS();GThreadManager->Join();두 곳에 브레이크 포인트를 걸었는데 신기하게 Join에 먼저 브레이크가 걸리네요. Launch 함수가 순차적으로 실행되고 메인함수의 반복문을 빠져 나온다음에 Join이 걸릴거 같은데요.Launch 함수가 쓰레드 함수라면 그럴 수 있겠지만 ThreadManager 자체는 쓰레드가 아닌데 왜 그런 것인가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
안녕하세요. xdelete 관련 질문이 있습니다.
아래코드에서 xdelete에서 굳이 소멸자를 호출해줘야 하는 이유?가 궁금합니다.강의내용이 new, delete 함수를 재정의해서 사용하는거라서 명시적으로 xdelete를 사용하기 때문에 Knight 소멸자에 객체를 해제하는 코드가 없는것 같은데, 그렇다면 굳이 소멸자를 호출하지 않아도 되지않나요?만약 소멸자에 객체를 해제하는 코드를 구현해 놓는다면 사실상 free를 두번하는거지 않나 싶어서요. template<typename Type> void xdelete(Type* obj) { obj->~Type(); xrelease(obj); }
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reader-Writer Lock 질문
동일한 쓰레드 내에서 WriteLock을 잡은 상태에서 ReadLock도 잡을 수 있는 것은 이해를 했습니다.그래서 한 쓰레드가 WriteLock도 잡고 ReadLock도 잡은 상태에서 WriteLock를 통해 데이터 수정을 한다면 ReadLock에서는 수정이 되기 전에 데이터를 읽게 되는 것이 아닌가요??예를 들면, WriteLock에서 잡은 데이터가 1이고 그 후에 ReadLock을 잡으면 Read부분에서는 1에 데이터를 읽는데 이 상태에서 WriteLock에서 1에 데이터를 2로 수정을 한다면 ReadLock에서 잡은 데이터가 2로 수정이 안되지 않나요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문있습니다
if (_popCount == 1) { Node* node = _pendingList.exchange(nullptr); if (--_popCount) { DeleteNodes(node); } else if (node) { ChainPendingNodeList(node); } delete oldHead; }_popCount가 1인 상태가 나 혼자 삭제하고 있는 중이고 혼자 삭제하는 중이라면 삭제가 예약된 데이터들도 삭제한다고 이해를 했습니다. 삭제가 예약된 데이터들을 삭제를 할 수 있는지 체크하는 부분이 위에 있는 if(--popCount) 조건문으로 알고 있는데 여기서 --_popCount를 하면 _popCount가 0이 되어서 나 혼자 삭제하는 중이여도 다른 예약된 데이터들을 삭제를 할 수 없는거 아닌가요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Cmake 에서 Generate 할때 CMakeLists.txt 파일이 없다는 Error는 어떻게 해결할 수 있나요??
이렇게 뜨는데 해결방법을 모르겠습니다 ㅠㅠ그리고버전을 23버전으로 사용했는데공부하는 시점에서 강의에 나오는 3.17로 진행하는건 문제가 없을까요??
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
포폴용 iocp서버를 배포 하고 싶습니다
포폴용 게임 서버 구성을 위 처럼 하고 싶은데, windows인 IOCP서버 배포에 관해서는 정보가 없어서 가이드를 받고 싶습니다. 게임에 대해 좀 더 구체적으로 말씀드리면회원가입/로그인 등 실시간성이 중요하지 않은 컨텐츠들은 ASP.Net으로 로비동작들을 구현하고실시간 성이 중요한 배구는 IOCP 서버로 소켓 연결해서 게임을 구현하고자 합니다. 위와 같은 구조로 게임 서버를 AWS에서 배포를 한다면 각 asp.net, redis, mysql, windows별로 EC2해서 배포 하는거 말곤 답이 없을까요...?혹시나, 도커를 쓸 수 있다면 혹시 가능하다면 말씀해주시면 감사하겠습니다.🙇♂️
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
클라이언트에서 서버 전향시 연봉 협상
안녕하세요 루키스님! 강의 언제나 잘 보고 있습니다!https://www.inflearn.com/questions/801980/%ED%81%B4%EB%9D%BC%EC%9D%B4%EC%96%B8%ED%8A%B8-%ED%94%84%EB%A1%9C%EA%B7%B8%EB%9E%98%EB%A8%B8-%EC%BB%A4%EB%A6%AC%EC%96%B4-%EA%B3%A0%EB%AF%BC몇달전에 해당 질문 글을 올리고 빡세게 공부해 서버 면접에 최종 합격했습니다!최종 합격은 한곳만 했고 아직 다른곳은 진행중인 상태입니다.다만 아쉬운점이 연봉 문제로 현재 회사에서 사천 중반 정도를 받고있는데 최종 합격한 회사에서는 연봉을 삼천 후반대로 제시해주시더라구요..서버 신입으로 지원했다보니 어느정도 감봉은 예상했지만 생각보다 액수가 커 고민중인 상황입니다.이정도는 감수하는게 보통일까요?바쁘신데 강의 내용에 관한 질문이 아니라 죄송합니다 ㅠㅠ
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문있습니다
함수 PromiseWorker, TaskWorker 이들에 인자를 오른값으로 받은 이유가 뭔가요??
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
버퍼 사이즈에 대해서
안녕하세요 강의를 보다가 버퍼사이즈에 대해서 궁금한 사항 문의 드립니다. 강의에서 버퍼 사이즈가 65536바이트로 해주셨는데 그렇다면 RecvBuffer 클래스에서 실제 버퍼 사이즈는 세션마다 대략적으로 640KB의 크기가 될텐데 이게 실제 IOCP서버에서 적절한 메모리양인지 궁금합니다
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Overlapped Model에서의 이벤트
WSAEventSelect Model에서는 이벤트 종류를 FD_ACCEPT(접속 클라 존재), FD_READ(수신 가능), FD_WRITE(송신 가능), FD_CLOSE(상대 접속 종료), FD_CONNECT(통신 연결 완료), FD_OOB 이런식으로 설정해 주었었는데 Overlapped Model에서는 hEvent에 이벤트를 할당해주면 따로 설정해줄 필요가 없는건가요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 중지 시 클라이언트에 통지가 안
안녕하세요. iocpcore부터는 난이도가 급상승 하는군요.간단한 클라이언트와 서버 모두를 overlapped callback으로 만들어 봤습니다.그런데 연결된 상태에서 서버가 중지를 하면 클라이언트의 콜백 함수로 연결이 끊어진 이벤트가 넘어오지 않습니다.서버는 클라이언트가 접속을 종료하면 접속 종료 이벤트를 받습니다.(콜백 함수로 전송바이트 0이 넘어옴)서버쪽에서는 accept를 한 다음에 리턴 된 클라이언트 소켓을 넘겨서 WSARecv를 호출한 상태이고요,클라이언트는 connect 호출 후 listenSocket을 넘겨서 똑같이 WSARecv를 호출했습니다.어떤 원인을 생각해 볼 수 있을까요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
align 이 메모리 주소에 영향을 주나요?
16바이트 정렬이면 주소값이 16의 배수여야 한다. 그래서 하위 4비트가 모두 0이다. 이렇게 이해하면 될까요? 그러면 4바이트 int는 주소가 4의 배수니까 마지막 2비트가 00 이런식으로 되는건가요?
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
TryPop 에서 exchange(nullptr) 을 쓰면 버그가 나는 이유가 궁금합니다.
안녕하세요! 강의 너무너무 잘 듣고 있습니다!!LockFreeQueue 완성 후, 1Push 2Pop 테스트는 잘 동작했으나, 2Push 2Pop 테스트부터 크래시가 났습니다.강의를 계속 돌려봐도 코드는 다른 것이 없었는데, 수업 자료에 첨부해주신 코드를 보니까 주석으로 exchange 를 사용하면 버그가 있다고 알려주셔서 일단 해결 방법을 확인 했습니다.그런데 문제를 만든 상황이 무엇인지 감이 안오네요.exchange 로 하면 문제가 발생하는 이유가 무엇인지 알 수 있을까요?원인과 문제가 되는 상황 궁금합니다!그리고 이러한 상황에서 어떻게 디버깅을 해야하는지에 대한 조언도 부탁드리고 싶습니다.답변 해주시면 정말 감사하겠습니다!