월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ArraySegment<byte>구조체 질문드립니다.
void RegisterRecv(){if (_disConnect == 1)return;_recvBuffer.OnClear();ArraySegment<byte> segment = _recvBuffer.WriteSegment;_recvArgs.SetBuffer(segment.Array, segment.Offset, segment.Count);bool pandding = socket.ReceiveAsync(recvArgs);if (pandding == false)RecvCompleted(null, _recvArgs);} 코드에서 ArraySegment<byte> segment = _recvBuffer.WriteSegment;를 하여새로운 segment를 만드시는데 ArraySegment는 구조체입니다. 구조체는 복사가 될 뿐 원본에 영향을 주지않는 새로운 객체로 알고있습니다.그런데 void RecvCompleted(object sender, SocketAsyncEventArgs args) 함수에서int processLen = OnRecv(_recvBuffer.ReadSegment);를 할 때 어떻게 원본 객체에 데이터가 들어가는지 궁굼합니다.!새로운 segment가 생성되어 스택에 쌓일 때 해상 스택에는 원본의 주소를 가지고 있는 건가요? 그래서 실제로는 구조체이기때문에 복사는 아니고 주소 참조? 맞나요? 감사합니다.!
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
사용프로그램 관련해서 질문드립니다.
서버 개발을 할 때 VSCode를 사용해도 괜찮을까요?VS가 아니라 VSCode를 사용하면 생기는 장단점이 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RecvBuffer 질문입니다!
안녕하세요! RecvBuffer 강의를 듣다 생긴 질문입니다.Clean() 함수를 만드는 16:00대에서, Clean 함수 안에 전역변수로 선정한 DataSize를 int dataSize 변수로 가져오고, 이를 if(dataSize ==0) 구문에서 사용합니다.왜 바로 전역변수인 DataSize를 사용하지 않고 dataSize 변수로 복사해 온 뒤에 사용하게 되나요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
C#의 BinaryFormatter로 패킷 송수신을 해도 될까요?
안녕하세요 루키스님 강의 잘 듣고 있습니다!다름이 아니라 C#의 BinaryFormatter 클래스를 사용하면 사용자 정의 클래스를 통으로 직렬화 및 역직렬화를 할 수 있다는 것을 알게 돼서 몇 가지 질문을 드리고자 합니다.(물론 해당 BinaryFormatter는 상호운영성이 떨어지며 멤버 변수에 Serialize 속성을 붙여줘야 한다는 단점이 있습니다.) 1.C# 끼리에서의 통신을 한다는 가정하에 BinaryFormatter으로 패킷을 직렬화 및 역직렬화 하여 통신을 할 수는 있나요?2.1번에서 만약 된다면 멤버변수를 하나씩 BitConverter 하는 것보다 한 번에 사용자 정의 클래스를 통으로 직렬화하는 게 더 좋다고 생각하는데 혹시 단점이 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Args.AcceptSocket 질문있습니다.
void OnAcceptCompleted(object sender, SocketAsyncEventArgs args) { // 낚시대를 끌어올림! if(args.SocketError == SocketError.Success) { _onAcceptHandler.Invoke(args.AcceptSocket); // client 소켓을 던져줄것! } else Console.WriteLine(args.SocketError.ToString()); RegisterAccept(args); // 다시 낚시대 던지기! }제가 궁긍한 부분은 넘겨받은 args의 AcceptSocket 부분인데요 공홈 문서에 따르면 AcceptAsync하기전에 설정해주지 않았다면 새로운 소켓이 만들어져있다고 써져있습니다.공홈 문서그런데, 영상에서는 clientSocket을 던져준다고 설명해주셨는데요. 그럼 client로부터 요청이 들어와서 accept 됐을 때bool pending = _listenSocket.AcceptAsync(args);AcceptAsync에서 받은 args에 클라이언트에 대한 정보가 들어간다는 것일까요? 아니면 빈 socket 인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
setmaxthreads 그리고 추가 질문
ThreadPool.SetMinThreads(1, 1);ThreadPool.SetMaxThreads(3, 3); 에서 최대 쓰레드가 3개라고 설정했는데 parallel로 실행하면아래와 같이 1,4,6,5 이렇게 4개의 쓰레드 id를 가지는지 궁금합니다.그리고 TLS가 static 변수를 각 쓰레드의 로컬 변수로 만들어서 사용한다는 건데 이 또한 lock을 걸어서 사용하는 건가요?만약 lock을 사용하지 않는다면 쓰레드 에서 값을 변경한 것이 static 변수에는 영향을 끼치지 않고 스레드 로컬에서만 사용한다는 것인가요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
OnRecv 질문
위 부분에서 dataSize를 알아낸 후 그만큼 데이터가 도착했는지 판별하는 부분에서질문 1. 만일 서버에 같은 세션으로부터 동시다발적으로 혹은 매우 짧은 간격을두고 Send요청이 일어나 여러 패킷이 멀티스레드로 Recv된다면 Recv버퍼에 dataSize만큼 데이터를 수신받았다고 하더라도 그 데이터가 항상 온전한 한 패킷의 연속적인 데이터로 도착하게끔 보장이 되나요?질문 2. 만일 그렇지않고 여러 뒤죽박죽 섞인다면 어떻게 뒤섞인 데이터를 분리하나요?옅은 지식으로나마 TCP에서 데이터의 순서는 어느정도 보장해주는것으로 알고있는데 한 패킷이 온전하게 도착할때까지 다른 전송이 대기하는지, 아니면 여러 요청중에서 먼저 도착하는 조각들을 무지성으로 때려박는지 아무리 찾아봐도 알 수 없어서 질문 남깁니다 ㅜㅜ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
소켓 null 에러 질문
안녕하세요. 질 좋은 강의 잘 수강중입니다~Connector 강의에서 배운 후에 실행했더니 아래와 같은 오류가 발생했습니다.디버그를 통해 원인을 찾아보니 Listener가 소켓을 null로 받고 있었습니다.어떻게 해야할까요 ㅠㅠ <Server><Client><Listener>
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
시간 복잡도는 사실상 똑같지 않나요?
안녕하세요 루키스님!항상 강의 잘 듣고 있습니다. 다름이 아니라 기존에는 N^2 의 시간 복잡도라고 말씀해주셨습니다. 그 이유도 충분히 이해했습니다.그래서 GameRoom.cs의 _pendingList와 Flush 함수를 패킷 모아 보내는 용도로 사용하셨습니다. 그러나 사실상 Flush 내부를 자세히 보면 결국 N^2으로 시간 복잡도는 똑같다고 생각합니다. 왜냐하면 Flush 내부에서 세션용 foreach와Send함수 내부에서 List<ArraySegment<byte>> 용의 foreach로 인해서 총 2개의 foreach가 돌기 때문에 시간 복잡도는 여저힌 N^2이지 않나요? 만약 10명의 클라이언트가 접속했을 때,[패킷 모아 보내기 할 경우]100개의 패킷을 한 번에 보내는 것[패킷 모아 보내기 안 할 경우]10개의 패킷을 10번 보내는 것 으로 이해 했는데 맞을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
packet Generator#2 강의 내용 궁금한게 있습니다.
강사님 안녕하세요.소스 분석 중에 궁금한게 있어서 질문 남깁니다. 패킷 제너레이터에서r.Read 에서 한 줄을 읽고, ParsePacket(r)로 호출이 되잖아요.- 그런데 ParsePacket의 인자형태가 참조타입이 아닌데,해당 함수에서 Read되는 값이 외부에 있는 r 객체에도 영향을 주더라고요.동일한 r 메모리를 가지고 Read를 하고 있다는 것인데,코드만으로 보기에는 매개변수 r에는 기존 객체 r값이 복사된상태에서 진행해야 된다고 생각하는데요.왜 이런지 알 수 있을까요? -----------어쨋든 동일한 경로에 있는 파일을 대상으로 해서 Read를 해서 그런 것일까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
10053,10054 소켓 에러
안녕하세요. Session #3 강의 수강 중, 테스트를 시도했는데 아래와 같은 에러가 발생했습니다.디버그로 실행하여 한 줄 한 줄 실행하면 잘 실행되는데 왜 Ctrl + F5로 실행하면 이럴까요 ㅠㅠ<DummyClient><ServerMain><Listener><Session><Session>
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
캐릭터 이동 끊김 현상 질문
안녕하세요,강의 잘 완료하고, 캐릭터를 멀티로 돌려보는중에 캐릭터가 순간이동 하는 현상을 처리하고싶은데, 잘안돼서 도움좀 요청드려봅니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Environment.Tickcount 오버플로우 질문이에요
public void Push(Action action, int tickAfter = 0) { JobTimerElem job; job.execTick = System.Environment.TickCount + tickAfter; job.action = action; lock (_lock) { _pq.Push(job); } } public void Flush() { while (true) { int now = System.Environment.TickCount; JobTimerElem job; lock (_lock) { if (_pq.Count == 0) break; job = _pq.Peek(); if (job.execTick > now) break; _pq.Pop(); } job.action.Invoke(); } }만약 현재 TickCount가 int.maxvalue에 근사한 값이라면 job.execTick이 오버플로우가 일어나 현재 시간보다 무조건 낮기 때문에 바로 실행되는 문제가 있을 것 같습니다. 제 생각이 맞을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
switch문과 딕셔너리 효율 질문입니다.
https://rito15.github.io/posts/cs-switch-case-vs-dictionary/이 내용을 보면 딕셔너리를 이용하는것보다 스위치문을 이용하는게 더 효율적인것으로 보이는데, 어떤것이 맞는지 모르겠어요
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
코드 오류 질문드립니다..ㅠㅠ
유니티 연동 #1 을 공부하는 도중 아래와 같은 오류가 떴습니다.유니티 서버를 연동하는 부분이고 정상동작을 한다면 Hello Server I am 1 이 출력되어야 합니다.소켓 부분에서 에러가 나서 OnConnectedCompleted 함수를 제대로 실행하시 못하는것 같습니다. 강의 파일을 받아서 실행해도 동일한 오류가 뜨고 아무리 구글링을 해봐도 해결을 못하겠어서 번거로우시겠지만 질문을 드립니다...
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
이렇게 이해한게 맞을까요 선생님?
실행 횟수 만번쓰레드1->_lock.Acquire(); 얘가 먼저 실행-> while로 반복 -> int original = Interlocked.Exchange(ref _locked, 1);-> 여기서는 오리지날이 0이기 때문에 바로 break->number++하고(이때 lock은 1)-> _lock을 0으로 만들어줌쓰레드2->얘는 대기하다 어느 시점에 얘가 가져감 즉, 쓰레드 1 과 쓰레드 2가 둘이 합쳐 총 2만번을 도는데 각각 번갈아 가면서 number를 ++했다가 --했다가 반복다만 연산을 했을 때 lock으로 잠구고 연산 후 lock을 풀어주고다른 쓰레드가 또 lock을 잠구고 lock을 풀어주고를2만번 반복해서 결과적으로는 한번에 하나의 연산만 진행결과는 0이렇게 이해했는데 이게 맞는지 모르겠습니다..
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티쓰레드 질문입니다.(파이썬과의 차이)
파이썬에서는 멀티쓰레드가 한개의 코어에서 쓰레드만 변경되가며 작업을 해서인지, lock을 안함으로 인한 문제가 발생한 적이 없던 것으로 기억합니다.비슷한 문제를 만드려면 멀티프로세싱을 이용해서 코드를 작성했었는데....C#에서는 멀티쓰레드를 활용하는데, 쓰레드가 독립적으로 실행되는 것이, 마치 각 쓰레드가 독립적인 코어에서 작동하는 듯한 느낌이 듭니다. 한개의 코어에서 쓰레드만 변경한다면 메모리를 순차적으로 가져다 쓸테니, lock에 대한 문제가 발생하기 않지 않나요???
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
질문드립니다.
예를 들어 유저1과 유저2의 거래를 진행한다고 가정할 때유저1에 있는 아이템을 유저2가 가져간다라고 한다면화면상으로는 유저1이 가지고 있는 아이템 한개가 유저2의 인벤에 저장이 되는건데 이 과정이 서버에서는 강의와 같이 유저1의 아이템을 없애고? 유저2의 인벤에 아이템을 추가하는 방식으로 진행되는건가요?ref로 인자값을 받는다고 하셨는데 ref가 아닌 일반적 인자로 받으면 원본이 바뀌는게 아닌 복사된 값이 바뀌어서 그런건가요? 즉, 원본은 바뀌지 않게 되므로 결과값이 이상하게 나오는거겠죠?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
패킷의 내용이 짤려서 올 경우
안녕하세요 루키스님! 몇 가지 여쭤볼게 있습니다.패킷의 구성은 패킷헤더 + 패킷내용으로 잘 이해했습니다.그러나 경우에 따라 패킷이 짤려서 올 수도 있으므로경우를 크게 2가지로 나눠봤습니다.패킷 헤더의 일부분만 도착한 경우이 경우는 PacketSession 클래스 덕분에도착한 패킷이 패킷헤더 사이즈인 2보다 작으면 다음 패킷 까지 기다리는 것을 이해했습니다.그러나 아래의 경우는 어떻게 될지 의문입니다.패킷 헤더와 패킷의 내용이 함께 도착했지만패킷의 내용은 절반만 도착함.이 경우 도착한 패킷이 패킷헤더 사이즈인 2보다 크므로 OnRecvPacket함수를 호출을 하겠지만사실상 패킷의 내용물이 절반밖에 되지 않으므로정상적으로 패킷을 못 받을 것 같은데 맞을까요?따라서 사실상 OnRecvPacket 함수 내부에서 해커로부터 보안의 목적 외에도 받은 패킷이 정말 끝까지 잘 받았는지 검사를 하기 위해 받은 패킷의 사이즈를 다시 한 번 더 클라와 교차검증을 해야할 필요가 있는건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
저는 왜 이렇게 나오는 걸까요?
선생님이랑 코드를 같게 작성 했는데 쓰레드가 시작되고stop이 트루니까 빠져나와서 바로 쓰레드 종료가 나와야 하는데stop호출이 나와버립니다.이건 제가 작성한 코드에요