Post

(TIL) 2025-01-09

(TIL) 2025-01-09

트러블 슈팅


배경

게임실행

멀티 플레이 과제 진행 중 클라이언트의 프로토 버프 타입에 맞게 서버의 프로토 버프 수정 후 테스트를 위해 값을 입력 후 접속하기 버튼을 눌렀지만 서버에는 오류가 없이 클라에서는 그림과 같이 화면이 변경되지 않는게 확인 되었다.

원인/분석

  1. 유니티에서 직접 테스트 빌드된 게임이다 보니 클라이언트 오류는 별도로 처리되어 있지 않으면 확인이 불가능 하니 클라이언트 코드를 깃허브에서 Clone하여 유니티에서 확인을 해보았다.

    클라이언트 오류

    유니티에서 실행했더니 역시나 오류가 발생하고 있었고 에러 로그를 통해서 ‘역질렬화’ 작업에서 문제가 발생 한 것을 확인 할 수 있었다.

  2. 클라/서버 디버깅 서버 디버깅 클라 디버깅

    서버와 클라이언트의 해당 부분에 브레이크 포인트를 걸어 데이터가 어떻게 흘러가고 있는지 확인을 해보았다. 서버와 클라이언트의 둘다 패킷의 최대 길이는 67로 서버에서 보내준 값이 클라에서도 누실 없이 정상적으로 받아오고 있는 것을 확인 할 수 있었다. 다만 클라이언트에서 데이터 추출 부분에서 의아한 점이 확인이 되었다.

    1
    2
    
     // 패킷 데이터 추출
     byte[] packetData = incompleteData.GetRange(5, packetLength - 5).ToArray();
    

    packetLength의 값은 63으로 확인되었는데 메세지의 전체 길이는 4 Byte, 패킷 타입에 대해서는 1 Byte로 정의 되어 packetLength - 5로 총 길이 67에서 헤더부분을 제외하면 62가 데이터 길이인데 58로 계산되어 오류가 발생하고 있는 것을 확인 할 수 있었다.

결과

계산법을 -5가 아닌 -1로 수정하고 다시 확인 해보니 정상적으로 게임이 진행되는 것을 확인 할 수 있었다. 게임 실행

(추가) 튜터님의 도움으로 위의 방법으로 해결을 할 수 있었고 이미 진행한 팀원과 해당 부분에 대해서 확인을 해보라고 조언을 받아 저녁 회의 시간에 문의 해본 결과 팀원 분은 -5 계산법으로 빌드된 게임으로 접속하고 있는 것을 확인 할 수 있었다. 위의 방법으로 처리 했을 때 해당 방법이 맞다고 하면 제공 받은 빌드된 게임으로는 접속이 전원 안되어야 한다. 그렇다면 먼저 진행한 분들은 확인이되어 안내가 되지 않았을까 라는 생각했었고 팀원분은 정상적으로 되고 있는 것을 보니 분명 나의 서버 코드가 문제가 있다는 것이 자꾸 머리 속에 맴 돌아 다시 확인을 해봤다.

1
2
3
4
5
6
7
8
9
//패킷 총길이 버퍼
// 패킷 길이 정보를 포함한 버퍼 생성
const packetLength = Buffer.alloc(config.packet.totalLength);
packetLength.writeUInt32BE(buffer.length + config.packet.typeLength, 0);

// packetLength.writeUInt32BE(
//   buffer.length + config.packet.totalLength + config.packet.typeLength,
//   0,
// );

다행히도 열심히 찾아본 결과 원인을 찾을 수 있었다. response의 바이트 버퍼를 생성하는 과정에서 총 길이에 대한 값은 메세지의 전체 길이 + 패킷의 타입 길이 + 데이터 길이 로 총 67이 나와야하는데 63이 전송되고 있었다. 즉 메세지의 전체 길이의 값이 누락된 것을 확인 할 수 있었다. 주석 부분으로 메세지의 전체 길이까지 더해주었더니 -5 계산법으로 게임이 정상적으로 진행되는 것을 확인 할 수 있었다.

This post is licensed under CC BY 4.0 by the author.