월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Listener에서 새로운 Session을 생성할때마다 각자 다른 Socket이 할당되는 원리
클라이언트가 접속했을때 Listener에서 session.Start(args.AcceptSocket); 을 통해 Session에 Socket을 주입하는데, new 하는곳이 없는데 어떻게 Socket을 자동으로 생성해서 AcceptSocket에 할당해서 뿌려주는지 알고싶습니다. Listen 함수가 호출된 소켓만이 AcceptAsync에서 응답이 왔을때 초기화 해주는 것일까요? 그리고 args.AcceptSocket = null; 로 밀어주는 이유가 있을까요? 다른건 다 초기화 되는데 이것만 초기화되지 않는 이유가 따로 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
강의 내용 중 질문 있습니다.
강의 내용중 아이템복사 문제에 대하여 Interlocked으로 어떻게 해결이 가능한지 궁금합니다. 지금 까지의 강사님께 배운 지식으로는 Interlocked으로 인벤에 넣고 빼는 것을 처리해도 거래중 서버가 다운되면 아이템 복사가 일어 나는 것 같아 질문드립니다.(함수 전체를 Interlocked 시키는 방법이 있을까 싶어서 도큐먼트를 봐도 없어 질문을 드립니다.) User1 => User2 집행검 거래시 1. 집행검을 User2 인벤에 넣어라 - Interlocked처리 완료 1.1 거래중 서버가 터짐 2. 집행검을 User1인벤에서 삭제 - 서버가 터져서 처리 중단? 결과. User1 ,User2 모두 아이템을 가짐.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Unity 실행이 안됩니다..
NetworkManager 에 script를 추가하고 실행을 하면 Unity가 멈춥니다. NetworkManager를 빼고 실행하면 실행이 되는데 뭐가 문제인지 잘 모르겠네요.. 노트북으로 실습하고 있습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
올려주신 강의에 버그가 있는 것 같습니다.
서버 GameRoom쪽 Enter에 보면 클라이언트 세션리스트에 ADD 해주는 부분이 있습니다. 따라서 500개의 더미세션을 넣게되면 0번부터 500번까지 하나씩 add됩니다. 문제는 sessions를 돌면서 PlayerList패킷 내부의 player리스트에도 세션 수 만큼 담게되는데, 어쨋든 그 이후에 직렬화 해주는 부분에서 list내용을 직렬화 할때 player list수 만큼 offset값이 계속 누적되면서 준비된 버퍼사이즈가 부족하게됩니다. 올려주신 강의는 16byte * 100 만큼 버퍼사이즈를 잡아서 500명까지는 괜찮습니다. 하지만 버퍼사이즈를 줄이거나, span.slice방식을 사용하면 직렬화 도중 크래시가 발생합니다. 우선 버퍼사이즈를 떠나서 계속해서 누적되는 부분 자체가 버그라고 생각되는데 혹시 제가 놓친 부분이 있는건가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Send의 Lock
안녕하세요. 항상 질 좋은 강의 감사합니다! 복습중에 이해가 안가는 부분이 있어 질문 드립니다. ServerCore의 Send부분 입니다. 제가 다음과 같이 이해를 했습니다. Send를 호출해서 Lock을 걸은 스레드가 RegisterSend를 호출하고, 여기서 pending이 true 라면 그대로 종료하면서 Lock을 풀고, 이후에 Send를 호출한 스레드는 Queue에만 담고 종료한다. 나중에 다른 스레드로 OnSendCompleted가 비동기로 호출되면, Queue를 확인해서 일감이 있다면 바로RegisterSend를 호출해서 처리한다. 일단 이렇게 이해하는게 맞는건지 궁금합니다. 만약 맞다면 Queue에 일감이 있어 OnSendCompleted를 비동기로 실행한 스레드가 RegisterSend를 호출하면, Send에는 Lock이 안 걸려있는 상태 이니 RegisterSend가 동시에 두 번 호출될 수 있지 않나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
BitConverter에서 헷갈리는 부분이 있습니다.
this.playerId = BitConverter.ToInt64(s.Slice(count, s.Length - count)); 부분에서 s.Slice(count, s.Length - count) 범위가 count 번 째에서 배열 끝까지 반환해주는거 같은데 그러면 배열의 남은 범위가 long보다 크면 ToInt64에서 앞에서 부터 long크기 만큼의 배열을 잘라서 반환해주는 건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
왜 8바이트가 나오는지 잘 모르겠습니다.
8:24에서 "ABCD"의 길이는 4인데 바이트 배열로 바꾸면 왜 8바이트가 되는지 모르겠습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
유니티 파일 저장
3분대에 유니티를 생성하고 저장할때, 저장공간을 MMO_server가 아닌 다른곳에서 저장하면 나중에 작동이 되지 않나요? 제일 궁금한것은 후에 강의도 다 보았는데, 유니티에 코드를 작성하고 실행하려면 서버도 실행해야 한다는 것이었습니다. 둘이 어떻게 연결이 되어있길래 서버에 있는 코딩에 따라서 유니티에 작동되는 것이죠?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
넷 버전 질문드립니다.
프로젝트 생성시 .net core가 없어서 설명란은 동일한 C# 콘솔어플리케이션으로 선택했는데요. 거기서 net 버전 고르는게 있었습니다. 2.1 / 3.1 / 5.0 이렇게 있던데 강의 영상 보니 3.1로 진행중이신거 같은데 5.0으로 해도 문제가 없을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Task 관련 질문드립니다.
해당 강의에서 ThreadPool을 이용해 쓰레드 수를 지정해서 Task로 작업을 지정해주었는데 만약 ThreadPool로 쓰레드 수를 지정하지 않는다면 Task를 선언할 때 마다 쓰레드가 생성되어 작업을 수행하는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
메모리 배리어 질문
질문이 있습니다. 1. 코드가 원래 함수안에서 순차적으로 위에서 아래로 실행되는걸로 알고 있는데 멀티쓰레드 환경에서만 이러한 현상이 생기는 건가요? 2. 쓰레드 실행순서에 궁금합니다. 그 두번째 예제에 쓰레드 t1 쓰레드 t2 를 만들고 t1.start() 먼저 시작하고 그 다음t2.start()하면 쓰레드 t1이 A()함수 실행 다하고 쓰레드 t2가 B()함수를 실행하는 방식인가요? 아님 동시에 실행되는 방식인가요? 만약 동시에 실행되면 꼬이지 않을까요? a함수는_answer=123을 넣고 b함수는 _complete를 체크하면 b함수는 _answer을 출력못하는데 제가 잘못 이해하고 있나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
WRITER_MASK로 원하는 값을 구분 가능한 이유가 스레드ID가 15bit로 표현할 수 있는 값보다 작아서 인가요?
첫번째로 쓰레드ID가 생성 순서대로 1 2 이런 식으로 붙혀지는 것인지 궁금합니다. 이것이 아니라면 어떤 규칙에 의해 ID가 생성되는지는 os나 사용 언어(C#, C++등)에 따라 달라지는 건가요? 두번째는 상식적으로 쓰레드개수가 1000개 10000개(이럴 일이 있을까요?)여도 15bit로 표현 가능한 수보다 ID값이 작기 때문에 MASK와 쉬프트 연산자로 계산 가능한 게 맞는지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문이 있습니다
서버 Unhandled exception. System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at System.Collections.Generic.List`1.Enumerator.MoveNext() at ServerCore.Session.send(List`1 list) in C:\Users\bekna\source\repos\Server\ServerCore\Session.cs:line 91 at Server.GameRoom.Flush() in C:\Users\bekna\source\repos\Server\Server\GameRoom.cs:line 45 at Server.Program.<>c.<Main>b__2_1() in C:\Users\bekna\source\repos\Server\Server\Program.cs:line 29 at ServerCore.JobQueue.Flush() in C:\Users\bekna\source\repos\Server\ServerCore\JobQueue.cs:line 51 at ServerCore.JobQueue.Push(Action job) in C:\Users\bekna\source\repos\Server\ServerCore\JobQueue.cs:line 28 at Server.GameRoom.Push(Action job) in C:\Users\bekna\source\repos\Server\Server\GameRoom.cs:line 38 at Server.Program.Main(String[] args) in C:\Users\bekna\source\repos\Server\Server\Program.cs:line 29 클라이언트 System.InvalidOperationException: Collection was modified; enumeration operation may not execute. at System.Collections.Generic.List`1.Enumerator.MoveNextRare() at DummyClient.SessionManager.SendForEach() in C:\Users\bekna\source\repos\Server\DummyClient\SessionManager.cs:line 24 at DummyClient.Program.Main(String[] args) in C:\Users\bekna\source\repos\Server\DummyClient\Program.cs:line 29 패킷 모아보내기 강의를 보고있고 프로그램을 실행하면 이런 예외가 뜨던데 혹시 이게 무슨 예외일까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
더미클라방식 말고 단일클라에서 서버세션관리
혹시 일반적으로 단일 클라방식에서도 서버세션을 리스트로 두는 경우가 있나요? 현재는 더미클라이언트 방식으로 하려고 클라쪽에서도 서버세션을 리스트로 두어서 관리하고 있는거 같은데
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
전체적인 알고리즘의 이해가 좀 어렵습니다..
Listener 클래스에서 SocketAsyncEventArgs args = new SocketAsyncEventArgs(); args.Completed += new EventHandler<SocketAsyncEventArgs>(OnAcceptCompleted); 1) 위의 두 줄의 코드가 정확히 어떤 것을 의미하는지 잘 모르겠습니다. args.Completed로 OnAcceptCompleted를 실행하고 RegisterAccept(args)도 또 실행해주는 건지.. 2) 그리고 pending이 true일 경우에는 RegisterAccept를 빠져나온 다음 다시 Init함수를 실행하기 때문에 위의 두 줄의 코드를 실행할 수 있게 되는 것이 맞는 이해일까요? 3) 마지막으로 Async가 있는 코드는 bool pending = _listenSocket.AcceptAsync(args); 이 코드밖에 없어서 pending이 참인지 거짓인지 판별만 가능할텐데, 어떻게 Async 함수를 통해 비동기적인 실행을 할 수 있는 것인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
도와주세요....
혹시 어디 이상한 부분이라도 있나요? 왜 이러죠....? 참고로 중간에 있는 사진은 GenPacket.bat을 관리자 권한으로 실행시키니까 뜬 창이에요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
hello server
hello server 가 잘나오다가 오류인지 나오지않습니다 범위를 벗어낫다고 하는데요... 어찌 잡아야될까요 ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
c++서버와 c#서버에서 쓰레드 사용
현재 루키스님의 c++서버강의를 보면서 예전에 들었던 c#서버를 계속 반복해서 보고 있는데 이해 안되는 부분이 c++에서는 OS가 네트워크 IO를 끝냈을때 이를 처리하는 쓰레드를 생성하여 일감을 처리하는 부분이 코드상에 들어가는데 c#에는 특별히 쓰레드에게 일감을 던져주는 부분이 코드상에 없는데 (task나 쓰레드를 만들지 않았는데)어떻게 주쓰레드위에 꽤 많은 쓰레드들이 생성되었으며 이 쓰레드들이 각각 send같은곳에서 일하고 있는지가 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PacketManager
패치 파일을 눌러도 packetmanager이 나오지 않습니다 F5를 누르면 오류가 뜨고, 고쳐야 하는 부분들은 강의 내용이랑 다 똑같은데 결과가 다릅니다 Listening... OnConnected : [fe80::f19d:c115:588d:bd5b%15]:53375 OnRecvCompleted Failed System.ArgumentOutOfRangeException: Specified argument was out of the range of valid values. at Server.PlayerInfoReq.Read(ArraySegment`1 segment) in C:\Users\stone\source\repos\Server\Server\ClientSession.cs:line 107 at Server.ClientSession.OnRecvPacket(ArraySegment`1 buffer) in C:\Users\stone\source\repos\Server\Server\ClientSession.cs:line 190 at ServerCore.PacketSession.OnRecv(ArraySegment`1 buffer) in C:\Users\stone\source\repos\Server\ServerCore\Session.cs:line 31 at ServerCore.Session.OnRecvCompleted(Object sender, SocketAsyncEventArgs args) in C:\Users\stone\source\repos\Server\ServerCore\Session.cs:line 162
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
CurrentBuffer
무슨 오류인지 이해가 잘 안됩니다...