월 17,600원
5개월 할부 시다른 수강생들이 자주 물어보는 질문이 궁금하신가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
음성채팅 UDP
음성채팅도 제가 만드는 프로그램에 넣을 예정인데요. 현재 TCP로 서버를 만들고 잇는데 음성채팅을 만약 UDP로 진행하게 된다면 음성채팅 서버 하나를 더 만들어서 하는게 나은가요 아니면 TCP 서버에서 LISTEN하는 소켓을 하나 더 열어서 한 소켓은 TCP 다른 하나는 UDP 이렇게 하는게 나은가요? 그리고 이런식으로 하나의 서버에서 TCP UDP를 혼용하는게 가능한가요? 또 클라이언트 같은 경우도 소켓을 두 개 만들어서 음성채팅 할 때는 UDP 소켓을 쓰고 다른 것을 할 때는 TCP 소켓을 쓰는게 가능한가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 서버에서 로그인 서버
처럼 소켓 통신이 아닌 http통신을 하는 서버도 지금 만들고 있는 게임 서버 내에서 패킷을 전송하는 식으로 다 처리를 하는게 일반적인가요? 아니면 따로 또 웹서버를 구성하는게 일반적인가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
receiveasync 질문입니다.
제가 이해한 바로는 receiveasync를 쓰게 되면 쓰레드풀에서 쓰레드를 하나 끌어와서 그 안에서 루프를 돌면서 데이터가 오는지 안오는지 체크하다가 온게 확인되면 args.Completed 를 invoke 시켜준다고 이해했는데요. 그럼 만약에 동접 10000명이 있는데 이들이 처음에 소켓에 연결하고 receiveasync 함수를 호출하면 쓰레드가 10000개가 생성되는 것 아닌가요? 그리고 만약 이 10000명이 send를 보내주기 전까지는 각각의 10000개의 쓰레드가 루프 안에서 블락되어 있는 상태 아닌가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
receiveasync나 sendasync나 호출할 때마다
쓰레드풀에서 새로운 쓰레드를 갖고 와서 거기서 데이터를 받거나 보내기까지 기다리고 있는 건가요? 그럼 한 클라이언트한테 동시에 send를 50개 보내는 상황이 생기면 쓰레드가 50개가 생기게 되는 건가요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Arraysegment return null 부분 컴파일 에러
open 함수의 if (reserveSize > FreeSize) 문 부분에서 return null과 ArraySegment<byte>.Empty를 둘 다 사용해 보았는데 null은 null을 반환할 수 없다 / Empty는 정의가 포함되어있지 않다는 오류가 발생합니다. .net 도 최신 버전으로 설치되어 있는데 왜 이러는건지 잘 모르겠습니다 ㅠㅠ 혹시 대체할만한 다른 코드가 있을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
GameRoom을 room에 복사하는 시점이 궁금합니다.
강의에서는 if (clientSession.Room == null) return; GameRoom room = clientSession.Room; if (Room != null) { GameRoom room = Room; room.Push(() => room.Leave(this)); Room = null; } 와 같은 형태로 Room이 null이 아닐 때 복사가 진행되는데 if문 전에 복사를 한 뒤에 복사본 값을 체크하는 쪽이 좋지 않을까 싶어 질문드립니다. 강의대로 따라해도 크래시가 나지 않아 테스트를 못해봤는데 멀티쓰레드 환경에서 Room을 따로 복사해두더라도 똑같이 크래시가 작동할 수 있지 않나요? 또, 혹시 복사를 사용하는 게 아닌 try catch finally 구문을 이용하여 NullException을 잡아주고 Disconnect에서는 finally에 Room을 null로 변환시켜주는 방식을 이용하는건 괜찮은지 궁금합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
C# 서버프로그래밍
삭제된 글입니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
RecvBuffer에 관한 질문입니다.
지난 강의에서 예를 들어 천명의 유저가 움직이고 스킬 쓰는 모든 행위들을 하나의 패킷으로 만들어서 보내는 것을 고려 할 수 있다라고 말씀해주셧던거 같은데, 그러면 이부분에서 만약에 BytesTransferred가 RecvBuffer버퍼 보다 커진다면 버퍼를 BytesTransferred크기만큼 재할당해서 데이터를 다시 받아줘야 하는걸까요? 질문 하다보니 생각난것이 RegisterRecv에서 Recv받을 데이터를 어느곳에 받을지 여기서 설정하는데 제가 준비한 버퍼보다 더 크키가 큰 데이터가 들어오면 초과한 데이터는 그냥 제가 준비해둔 버퍼 위치에서 복사가 되는것인가요? 질문이 두서가 없는것 같은데 ㅠㅠ 죄송합니다
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
ThreadLocal<SendBuffer> 관련 질문입니다.
강의 듣다가 그림이 잘 안그려지는 부분이 있어서요. 경합을 피하기위해 각 쓰레드마다 고유의 SendBuffer를 갖게끔 만들어 준것 같은데 , 제가 이해한대로면 , 예를들어 100명의 유저가 행동한 정보를 모아서 SendBuffer에 담아서 각 100명에게 다시 보내주는 방식으로 생각했습니다. 이런 과정을 하나의 작업 단위라고 보았을때 쓰레드 하나가 모두 처리하는 것인가요? 그러고 다음작업은 다른 스레드일수도있고 동일쓰레드일수도있고.. 쓰레드 마다 고유의 SendBuffer가 있다면 서로 각각 내용물이 다르게 될텐데 강의에서 Knight 클래스의 정보를 담는 과정에서 다른 쓰레드가 바통터치하듯 중간에 낚아채는 경우는 없나요? 마지막 부분에 sendBuffer안에 있는 buffer는 다른 쓰레드가 참조는 하지만 읽기만 하기 때문에 상관 없다고 하셨는데 애당초 tls에 할당을 해준건데 참조가되나요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
IPacket 인터페이스를 상속했는데도 왜 MakePacket<T>에 T타입으로 넣었을때 오류가 나는걸까요?
.Register()에서 함수를 인자로 넘길때 IPacket이 상속되지않은 클래스라서 안된다고 오류가 나더라구요 분명히 IPacket을 상속했는데 왜 저러는걸까요? where T 에서 IPacket 조건을 삭제해서 하니 Register할때의 오류가 없어지긴하는데 MakePacket()함수내에서 p.Read()함수가 오류나게되네요
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
디버깅 시작 시 오류가 뜹니다
처음부터 안된게 아니라 잘 되다가 vs를 껐다 킨 후 부터 계속 디버그 자체가 실행이 안됩니다. 코드상 문제는 아닌거같은데.. 이유를 잘 모르겠습니다 ㅠ
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
게임 프로그램에서 궁금한 점을 여쭤보고 싶어요!
게임을 이용하는 유저는 보통 자신의 화면에 뿌려진 화면을 보고 자신이 어떤 행동을 할지 판단할텐데요. (예를들어 몬스터를 공격한다던지...) 여기서 화면에 뿌려지는 부분이 클라이언트 프로그램 부분이고 실제로 케릭터를 이동하고 몬스터를 공격하고 하는 등의 이벤트들은 서버단의 로직으로 처리가 되는 것으로 이해를 하고 있습니다. 여기서 궁금한 점은 클라이언트 프로그램을 개발하시는 분들은 웹 서버로 치자면 프론트 엔드단을 개발한다고 생각하는 게 맞는 것인지요 ? (물론 케릭터 디자인, 사운드등 다양한 파트로 나뉘어져 있겠지만요) 즉 케릭터가 이동을하게 되면 서버 로직에서 케릭터의 위치를 변경시킬테고 클라이언트 프로그램은 서버에서 변경된 위치를 가져다가 UI적 요소를 움직여 주는 것 정도로 볼 수 있을까요 ? 그리고 케릭터가 화살을 쏠 때 날라가는 화살을 UI에 반영해주는 부분은 서버단에서 제공해주는 로직하고 상관이 없다고 보는게 맞을까요 ?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
멀티스레드에 대한 효율성에 관해서 질문이 있습니다!
멀티스레드를 사용할 경우 하나의 프로그램에서 생성해준 스레드 수만큼 CPU 코어를 할당받는 것으로 알고있습니다. 만약 프로그램에서 스레드를 3개를 사용하고 있다면 동시 다발적으로 3개의 코어를 할당받을 수도 있고 하나씩 순차적으로 할당받을 수도 있겠지요... 멀티스레드에 대해 학습하면서 느낀점이 결국 멀티스레드를 사용하면 실행 흐름을 단정지을 수 없다라고 느껴지는데요. 먼저 스레드를 할당받은 함수가 먼저 끝난다는 보장도 할 수 없으니까요... 그러니까 결국 실행흐름이 보장되지 않는 상황에서 여러 개의 스레드가 공유자원에 동시에 접근해서 수정하는 행위를 막아야 되는 것이라고 생각하고 있습니다. 그렇다면 일반적으로는 하나의 스레드가 공유자원에 접근해서 수정하고 수정된 값을 사용하는 것까지를 원자성으로 보장해야 될테고 원자성을 보장하기 위해 Lock을 사용하는데 단일 스레드의 효과가 나와버리는 거 아닌지요 ? 멀티스레드는 공유자원을 최대한 사용하지 않는 곳에 사용을 해야 되는건지요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Disconnect시
Disconnect시 _disconnect 변수를 1로 바꿔줘서 연속해서 연결해제에 문제가 안생기도록 하는 것은 이해가 됐습니다. 그런데 이제 0으로 다시 초기화를 안시켜줘도 되는지에 대해 궁금합니다. 이 Session Class를 재활용을 안하는 것인지 아니면 굳이 해줄 필요가 없는 것인지 알고 싶습니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
PacketManager 가 멀티 쓰레드 상에서 안전 한지 질문 드립니다.
PacketManager.Instance.Register() 로 Call 하는 부분을 자동화 시키시면서 생성자 안으로 옮기 셨는데 해당부분은 첫번째 패킷이 리시브가 될때 call될거 같은데 멀티 쓰레드에서 문제가 없을까요?
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
Client 쪽에서 접속 확인
Client 쪽에서 아래와 같이 Connect 후 바로 접속 상태를 확인하려고 합니다. SessionManager에서 Session을 가져와 Session Socket의 bool형 변수 IsConnected 값을 return 해주는 방식으로 IsConnected() 함수를 구현해놨고 위 처럼 Client에서 Connect 후 바로 호출하니 SessionManager에 포함된 List에 추가되기 전이라 false가 return 되고 있어 약간의 Sleep을 걸어주어 해결했습니다만, 아마도 ConnectAsync 비동기 접속이다보니 실제 눈으로 보기엔 서버가 켜져있을 시 바로 접속 되는 것처럼 보이지만 프로그램 처리 과정에선 Connect() 함수 호출 후 바로 IsConnected()로 바로 넘어가니 그 간격이 생겨 그런거 같은데 맞나요? 그리고 실제 게임이나 여타 TCP Client에서 접속 확인을 할때도 저처럼 Sleep을 줘서 처리하나요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
JobQueue #1 12:40 초
JobQueue #1 12:40 초 부분에 '어차피 Pop을 실행하는 스레드는 Flush를 실행한 스레드 하나일뿐인데 왜 lock을 걸어줄까?' 의 답으로 'JobQueue에 일감을 Pop하는 동안에도, 넣는일을 다수의 스레드가 할 수 있기 때문이다.' 라고 답을 주셨는데 이부분이 좀 이해가 안 갑니다. 이해를 돕기위해 조금만 추가적으로 설명해 주실수 있을까요?
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
세션에관하여 질문있습니다
안녕하세요 강의를 듣던 중 session 생성에 관하여 궁금한점이 생겨 질문드리게 되었습니다. 위 코드에서 _sessionFactory를 이용하여 Session 인스턴스를 만든 후(강의에선 GameSession) Start와 OnConnected 함수를 수행하고나면 가비지컬렉션 대상에 포함되지 않나요? 즉, 세션이 사라지지 않나요? Start 함수 안의 낚싯대를 던져놓는 AcceptAsync함수 때문에 가비지 컬렉션 대상에서 제외되는건가요? 읽어주셔서 감사합니다.
- 미해결[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
서버 종료 및 재시작은 보통 어떻게 하나요?
클라이언트 같은 경우 Shutdown() , Close () 호출하도록 강의 또는 구글에서 찾을 수 있는데 서버 실행 후 종료 재실행 같은 기능이 필요하다면 중간에 종료는 보통 어떤식으로 처리 하시나요? _listenSocket.Shutdown();를 사용하면 아래와 같은 Exception 에러 메세지가 뜨고 Listener Close Error : System.Net.Sockets.SocketException (0x80004005): 소켓이 연결되어 있지 않거나 Sendto 호출을 사용하여 데이터그램 소켓에 보내는 경우에 주소가 제공되지 않아서 데이터를 보내거나 받도록 요청할 수 없습니다. UnityEngine.Debug:Log (object) KETI.NET.SERVER.Listener:Close () (at Assets/Modules/Network/KetiNetwork/Scripts/Core/Listener.cs:75) _listenSocket.Close(); 를 사용하면 OperationAborted 라는 메세지가 뜨고 다시 한번 _listenSocket.Init(); 함수를 사용하면 정상적으로 Client 접속이 안되더라구요.
- 해결됨[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버
SocketAsyncEventArgs 재설정에 관하여
안녕하세요 수업을 듣던중 궁금한점이 생겨 질문드리게되었습니다. AcceptAsync를 사용할 때에는 다시 예약할 때 args.AcceptSocekt = null과같은 작업을 해주고 등록을 시켰는데요 ReceiveAsync를 사용할 때에는 다시 예약할 때 args의 버퍼를 다시 비워준다는지 등의작업은 안해도 되는건가요?