묻고 답해요
141만명의 커뮤니티!! 함께 토론해봐요.
인프런 TOP Writers
-
해결됨[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 로 하면 문제가 발생하는 이유가 무엇인지 알 수 있을까요?원인과 문제가 되는 상황 궁금합니다!그리고 이러한 상황에서 어떻게 디버깅을 해야하는지에 대한 조언도 부탁드리고 싶습니다.답변 해주시면 정말 감사하겠습니다!
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Reference Counting의 멀티 쓰레드 환경에 대해서 질문이 있습니다.
Reference Counting의 코드가 멀티 쓰레드 환경에서 잘 작동한다고 말씀해주셨습니다. 제가 코드를 공부하고 있는데, RefCounting.h의 inline void Set(T* ptr) { _ptr = ptr; if (ptr) ptr->AddRef(); }이 부분에서 if(ptr)은 통과를 했는데, ptr->AddRef()를 하기 직전에, 해당 ptr이 Release 되어서 nullptr이 되버린다면, nullptr의 AddRef()를 호출함으로 오류가 뜰 수 있다고 생각이 되었습니다.이렇게 된다면 멀티 쓰레드 환경에서 잘 작동하지 않는다고 생각이 들었는데, 제가 수업을 들으면서 무언가 놓친 것이 있는 걸까요?
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Client에서 WSAEventSelect 사용하고싶어서 작성했는데 문제가생겼어요
Client에서 WSAEventSelect 사용하고싶어서 작성했는데FD_WRITE Event가 한번발생 후 그뒤로 발생을 하지 않습니다주의사항대로라면 FD_WRITE발생시 send를 호출하지 않으면 두 번 다시 발생하지 않는다고 했는데 그건 아닌거같아 혹시 어디서 문제가 발생한건지 봐주실수있나요?? // Send while (true) { //연결된 Event중 동작 가능한 Event 탐색 //WSAWaitForMultipleEvents(저장된 이벤트수,이벤트배열 시작주소,이벤트 성공을 모두 기다릴지 여부,타임아웃,FALSE) int index = WSAWaitForMultipleEvents(vecWSAEvents.size(), &vecWSAEvents.front(), false, WSA_INFINITE, false); //작업오류상태 if (index == WSA_WAIT_FAILED) continue; //return 된 index에 WSA_WAIT_EVENT_0를 빼주면 실제 실행된 Event의 Index를 구할 수 있다. index -= WSA_WAIT_EVENT_0; //어떤 종류의 Event가 발생했는지 확인 WSANETWORKEVENTS NetworkEvents; Result = WSAEnumNetworkEvents(ClientSessions.m_Socket, vecWSAEvents[index], &NetworkEvents); if (Result == SOCKET_ERROR) continue; //Read Event 발생 if (NetworkEvents.lNetworkEvents & FD_WRITE) { //Error 체크 if (NetworkEvents.iErrorCode[FD_WRITE_BIT] != 0) continue; Result = send(ClientSessions.m_Socket, ClientSessions.m_strBuff, sizeof(ClientSessions.m_strBuff), 0); if (Result == SOCKET_ERROR && WSAGetLastError() != WSAEWOULDBLOCK) continue; std::cout << "Send Data ! Len = " << sizeof(ClientSessions.m_strBuff) << std::endl; std::this_thread::sleep_for(std::chrono::seconds(1)); } }
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
pyinstaller UnicodeDecodeError 가 발생합니다.
안녕하세요. 강의 잘 듣고 있습니다.다름이 아니라, pyinstaller 대부 modulegraph.py 에서 오류가 있어서 이것저것 인코딩을 바꿔줘도 문제가 사라지지 않습니다.pyinstaller가 문제가 없다고 한다면 제 쪽 환경에서 문제가 있는건데 아무리 서치를 해도 compat.py? 쪽에 문제가 있는 분들은 많으신데 modulegraph에 문제가 있다는 분은 안보이네요..명쾌한 해결책을 가지신 분들 꼭 해답을 알려주세요..
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
콘솔창에 값이 뜨는데 까지 오래걸리는데...
안녕하세요 선생님다름이 아니라 콘솔창에 값이 나온는데 너무 오래 걸려서 질문남깁니다..구글링을 며칠간 해보면서 보안프로그램 충돌 의심 => 보안프로그램 삭제비주얼 스튜디오 재설치 를 해봤는데도 해결이 안되고 정보가 없어서 여기에 질문을 남깁니다..이 상태로 30초 정도 기다려야지 값이 나오더라구요실습 동안에 계속 이 현상이 나타납니다.저 화면은 그냥 std::cout만 했는데 30초 이상 기다려야되네요...혹시 이런 상황을 겪어보신적이 있나요?? 감사합니다
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Client에서 Send한 정보는 그럼
Client에서 Send한 정보는 그럼 Server에서 Recv 하지 않으면 Client 컴퓨터의 SendBuffer에서 대기하는건가요? 아니면 Server컴퓨터의 RecvBuffer에서 대기하는건가요??
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SetReuseAddress 보안문제
MSDN을 살펴보니까 ReuseAddress 옵션 설정 시 보안 문제가 발생 할 수 있다고 써있는데 실무에서도 이방법이 사용 되나요?
-
미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part9: MMO 컨텐츠 구현 (DB연동 + 대형 구조 + 라이브 준비)
비밀번호 암호화 질문
안녕하세요 강사님!다름이 아니라 비밀번호 암호화와 관련한 질문이 있습니다.실제로는 비밀번호 암호화가 필요할텐데 일반적으로 클라에서 비밀번호를 암호화 한 상태로 서버에 넘기는지, 클라에서는 비밀번호를 쌩으로 넘기고 서버에서 암호화를 해서 DB에 저장하는지 궁금합니다 !
-
미해결[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PROTOBUF 적용하고 빌드도 성공은 했는데 헤더 파일에서 에러가 발생합니다.
PROTOBUF_NAMESPACE_OPEN 인식이 안되고다른 에러들도 있는데 원인이 뭔지 몰라서 어떻게 해결해야 할 지 잘 모르겠습니다.빌드는 잘 되는데 .proto에 정의한 message 객체를 생성하고 값을 set 하려고 하는데 자꾸 에러가 생깁니다.syntax = "proto3";package example;message Person { string name = 1; int32 age = 2; repeated string hobbies = 3;} example::Person person; //사용자로부터 문자열을 입력 받는다. std::string name, hobby1, hobby2; std::cout << "이름: "; getline(std::cin, name); name.erase(name.find_last_not_of("\r\n") + 1); std::cout << "취미1: "; getline(std::cin, hobby1); hobby1.erase(hobby1.find_last_not_of("\r\n") + 1); std::cout << "취미2: "; getline(std::cin, hobby2); hobby2.erase(hobby2.find_last_not_of("\r\n") + 1); std::cout << "나이: "; int age; std::cin >> age; std::cin.ignore(); // 입력 버퍼 비우기 person.set_name(name); // 여기서 에러 person.set_age(age); person.add_hobbies(hobby1); person.add_hobbies(hobby2);
-
해결됨[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
스마트포인터를 활용한 설계에 대한 질문
안녕하세요 루키스님 프로젝트에 스마트포인터를 사용해보려고하는데 제가 생각한 설계가 맞는지 궁금합니다C++ 서버 강의에서 스마트포인터에 대한 설명을 들었는데 Shared_ptr은 상호참조문제가 있고 이를 해결하기 위해 Weak_ptr을 사용한다고 설명해주셨는데Weak_ptr이나 Shared_ptr을 잘 사용해서 상호참조로 인한 문제를 잘 해결하면 좋겠지만 프로젝트 크기가 커지다보면 상호참조 관계를 명확하게 파악하기 어렵다는 단점이 존재할수 있다고 생각합니다 그래서 제가 생각한 방법은 어떤 객체에서 다른 객체의 생명주기를 자신이 직접 관장한다면 shared_ptr 그렇지않다면 weak_ptr로 멤버를 두고 관리하고 shared_ptr인 멤버는 항상 weak_ptr로 반환하도록 하는게 좋지 않나라는 생각입니다 강의에서 설명해주신 Knight를 예로들어보면Knight끼리 서로를 타겟으로 지정할수 있다고 할때 Class Knightprivate :weak_ptr<Knight*> targetshared_ptr<Weaphon*> weaphon 위 코드를 예로들면 타겟 가능한 기사객체는 자기 자신이 생명주기를 관장하는 멤버가 아니기떄문에 weak로 두고 기사가 들고있는 무기의 경우는 기사가 죽을때 같이 사라지는게 자연스럽다고 볼수 있기 때문에 shared로 둬서 knight가 죽을떄 자연스럽게 같이 사라지도록 설계하고만약 대장간 같은데서 강화를 위해서 weaphon을 참조해야한다면 Knight에서 weak_ptr<Weaphon*> GetWeaphon() 이런식으로 설계해서 상호참조를 예방할수 있도록 설계하는것이 어떻겠냐는 생각을 개인적으로 해봤는데 이에대해서 어떻게 생각하시는지 궁금합니다