인프런 커뮤니티 질문&답변

김병대님의 프로필 이미지
김병대

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

유니티 연동 #4

ClientSession의 Room이 null인 경우

해결된 질문

작성

·

262

·

수정됨

0

안녕하세요.
Part 4를 완강하고 Part 7으로 넘어가기 위해

새로운 솔루션을 생성해서 기존 Part 4 솔루션 내의

프로젝트들을 우선 Ctrl + C, V 한 뒤 기존 프로젝트 추가로

Part 7에서 사용할 서버 솔루션을 Part 4와 동일하게 맞추는 작업을 하고 있었습니다!

그런데, DummyClient의 연결 수를 20개 정도로 하면 문제가 없지만, 30개부터는 특정 ClientSession의 Room이 null인 상태에서 서버 측의 C_MoveHandler가 실행되어 서버가 뻗어버리는 경우가 간헐적으로 발생하고 있습니다.

(강의 보면서 따라 한 솔루션은 100이면 100 잘 되며, 새롭게 복사한 솔루션은 대부분 잘 되지만 가끔식 위 오류가 발생합니다..)

 

처음엔 단순히 Ctrl+C , V 하는 과정에서

프로젝트나 솔루션의 설정값들이 새로운 경로로 옮기면서 동기화가 안되어 생기는 문제인 줄 알았는데,

코드를 계속 천천히 읽다보니 의문이 들게 되었습니다.

 

public GameRoom? Room { get; set; }

public override void OnConnected(EndPoint? endPoint) {

Console.WriteLine($"OnConnected: {endPoint}");

Program.Room.Push(() => Program.Room.Enter(this));

}

제가 이해한 바로는

ClientSession의 Room은

Listener에 의해서 ClientSession.OnConnected가 호출되며 Program.Room에게 Enter(this)를 요청하고,

이후 Program.Room은 Flush()를 통해 특정할 수 없는 시점에 비로소 Enter를 호출하게 되며, ClientSession.Room이 자기 자신을 가리키도록 합니다.

 

그런데, 정말 운이 안 좋다면 Program.Room이 A번 ClientSession에 대한 Enter 작업이 미처 다 수행되기 전에

DummyClient 측의 SendForEach로 인해 A번 ClientSession과 대응되는 ServerSession으로 이동 패킷을 보내고,

최종적으로 A번 ClientSession의 Room이 null인 상태에서 C_MoveHandler를 실행 할 여지가 있는 것이 아닌가 생각하게 되었습니다.

 

혹시 제가 생각하고 있는 것이 맞는건지,

아니면 단순하게 솔루션을 잘못 복사해와서 문제가 생긴건지

궁금합니다..

만약 그런 여지가 있다면 단순히 room이 아직 null인지 체크하고 이동 패킷을 무시하면 되는걸까요?

답변 2

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

네 강의 코드가 개념을 설명하는데 집중되어
잔버그가 없는게 아닙니다.
위의 경우 널체크를 해주시거나, 일일히 NULL 체크가 번거롭다면
사용하지 않는 빈 방 (허수 Room)을 만들어서 그쪽으로 코드를 타게 하기도 합니다.

김병대님의 프로필 이미지
김병대
질문자

빠른 답변 감사합니다!

0

안녕하세요, 인프런 AI 인턴입니다. 김병대님.

질문하신 내용은 C#과 유니티를 사용한 게임 서버 개발에서 클라이언트 세션의 ‘Room’ 프로퍼티가 null인 경우와 관련된 질문으로 보입니다. 클라이언트의 빠른 연결과 패킷 전송으로 인해 ‘Room’이 초기화되기 전에 ‘C_MoveHandler’가 호출되어 발생하는 System.NullReferenceException 예외 케이스에 대한 고민으로 보이네요.

오류 메시지와 설명을 바탕으로 이와 유사한 상황에 대한 해결 방법이나 설명을 제공하는 기존 답변을 찾을 수 있었습니다.

  • GameRoom 관련 질문입니다.

    • 질문 내용에 대한 스크린샷
    • 해당 링크에서는 강의를 따라하면서 이해가 잘 되지 않는 부분에 대해 강의를 진행한 지식공유자가 직접 답변을 제공했으며, 사용자의 이해와 같이 멀티 스레드 환경에서의 동작 순서와 초기화 시기에 대한 부분을 설명하고 있습니다. 비슷한 맥락의 문제로 보이기 때문에 참고하시면 도움이 될 것 같습니다. 질문&답변 링크
  • 19:10초 부분 질문있습니다!

    • 질문 내용에 대한 스크린샷
    • 이 질문은 특히 멀티스레드 환경에서 객체의 상태를 복사하는 것과 관련 있으며, 멀티스레딩에서의 동기화 문제를 해결하는 방법에 대한 질문이었고, 지식공유자가 해당 문제를 이해했는지 확인하는 답변을 제공했습니다. 해당 답변은 실시간으로 상태가 변할 수 있는 멀티스레드 환경에서의 안전한 데이터 처리 방법을 이해하는 데 도움이 될 수 있습니다. 질문&답변 링크
  • Handler 질문 + 11분 질문

    • 질문 내용에 대한 스크린샷
    • 이 질문에서는 복사와 캐스팅 문제로 인한 이슈를 설명하고 있으며, 지식공유자가 이에 대한 해결책으로 적절한 답변을 제공하였습니다. 이 역시 클라이언트 세션과 관련한 문제 해결에 도움이 될 수 있습니다. 질문&답변 링크

이러한 유형의 문제에서 공통적으로 여러 클라이언트 세션을 동시에 취급할 때 발생 가능한 문제로 간주되며, 특정 상태(예를 들어 ‘Room’의 초기화)에 대한 멀티스레드 접근이 올바르게 관리되어야 함을 의미합니다.

고려해 볼 수 있는 해결 방법으로는:
- ‘Room’ 프로퍼티의 값이 null인지 체크하고, null일 경우 이동 패킷을 무시하는 간단한 방법.
- 멀티스레드 환경에서의 동기화 메커니즘을 통해 ‘Room’ 프로퍼티가 안정적으로 초기화될 때까지 기다린 후 작업을 수행하도록 로직을 구성하는 보다 안정적인 방법.

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

김병대님의 프로필 이미지
김병대

작성한 질문수

질문하기