뒤끝 매치의 에러에 관하여 여쭤볼게 있습니다.

뒤끝 매치 서버에 접속은 정상적으로 잘 진행됬습니다.

그래서 뒤끝 매치 관련 모든 기능을 무사히 호출하여 인게임 방에 대한 정보를
받고 해당 정보를 이용하여 인게임 서버에 접속 할 때 어떤 에러인지 기억이
나지 않지만 어떤 에러에 의하여 연결에 실패하였습니다.

그래서 다시 테스트를 위하여 접속을 하였더니

비정상적인 방법으로 재접속을 시도하거나 서버에 이전 세션 접속 기록이 남아있어 접속에 실패한 경우
ErrInfo : ErrorCode.AuthenticationFailed
Reason : Invalid rars operation (0).

해당 에러가 출력됩니다. 그래서 이전에 에러에 의해서 비정상적으로 종료되어 그런가 보다하여

재접속 기능을 구현하여 위 처럼 현재 남아있는 세션에 재접속을 해주려고

IsGameRoomActivate 를 호출하니간 bro.IsSuccess() 부분에서 펄스로 걸러져서

NotFoundException 404 : room not found, room을(를) 찾을 수 없습니다.
라는 에러가 출력이 되는데요. 현재 남아 있는 세션이 있어 새롭게 접속도 되지않고
재접속 여부도 확인이 되지않아 막혀있는 상태인데요. 왜 그런 것이며 어떻게 해야할가요?

안녕하세요 개발자님,
게임룸을 생성하였지만 들어가지지 않는 경우, 해당 게임룸은 유저가 들어오지 않아 폐기가 진행됩니다.(폐기에는 최소 1분이상 소요)
이 때, 폐기가 이루어지는 동안은 게임룸을 찾을 수 없기에 말씀하신 것과 같은 상황이 됩니다.

해당 상황에서는 다른 매치 신청을 통해 새로운 게임을 찾도록 유도하여 이용해 주세요.

네, 해당 자동 폐기에 관련하여 문서에서 저도 본 것 같아서 기다려본 후 접속을 시도해도
계속

비정상적인 방법으로 재접속을 시도하거나 서버에 이전 세션 접속 기록이 남아있어 접속에 실패한 경우
ErrInfo : ErrorCode.AuthenticationFailed
Reason : Invalid rars operation (0).

에러가 출력되어서 재접속 기능을 만들어서 시도 해봤던 것이였습니다.

방이 폐기가 되지 않고 계속 위와 같은 에러를 출력하는 경우의 수가 있을가요?

현 시간 다시 시도를 해보았습니다.
게임이 폐기가 됬는지 다시 인게임 서버 접속은 시도가 됬으나

args.ErrInfo.Category : NetworkTimeout
args.ErrInfo.SocketErrorCode : Success
args.ErrInfo.Reason : Session Disconnect (0)

이런 에러 메시지가 출력이 되면서 접속이 되지 않아 종료 하였습니다. (물론 해당 에러 메시지가 뜰 당시 뭐 앱을 비활성화(백그라운드 이동) 및 어떤 동작은 없었습니다.

그리고 재시작을하면 이미 존재하는 게임이 있다는 200번에 걸리지 않고

비정상적인 방법으로 재접속을 시도하거나 서버에 이전 세션 접속 기록이 남아있어 접속에 실패한 경우
ErrInfo : ErrorCode.AuthenticationFailed
Reason : Invalid rars operation (0).

해당 에러가 발생하고 여기서 다시 재접속을 하면 재접속 가능에 걸리긴 합니다.

using UnityEngine;
using UnityEngine.UI;
using UnityEngine.Events;
using BackEnd;
using BackEnd.Tcp;
using LitJson;

public class CombatManager : MonoBehaviour
{
    [SerializeField]
    private CharacterPage characterPage;
    [SerializeField]
    private Canvas canvas;
    [SerializeField]
    private GameObject combatBackground;
    [SerializeField]
    private Text text_Matching;

    private string currentGameRoomToken;

    private void Start()
    {
        Backend.Match.OnJoinMatchMakingServer = OnJoinMatchMakingServer;
        Backend.Match.OnMatchMakingRoomCreate = OnMatchMakingRoomCreate;
        Backend.Match.OnMatchMakingResponse = OnMatchMakingResponse;
        Backend.Match.OnMatchMakingRoomDestory = OnMatchMakingRoomDestory;
        Backend.Match.OnSessionJoinInServer = OnSessionJoinInServer;
        Backend.Match.OnMatchInGameStart = OnMatchInGameStart;

        //게임 시작 시 미리 매치메이킹 서버에 접속해 두고 계속 접속
        //매칭 서버는 계속 접속한 상태로 놔둘 예정. 
        JoinMatchMakingServer();
    }

    private void Update()
    {
        Backend.Match.Poll();
    }

    //결투 입창 버튼에 이벤트로 연결, 클릭 시 접속 시도.
    public void EnterCombat()
    {
        canvas.sortingOrder = 10;
        text_Matching.gameObject.SetActive(true);
        combatBackground.SetActive(true);
        GlobalManager.Instance.PlayBgm(SOUND.Combat);

        BackendReturnObject gameRoomBro = Backend.Match.IsGameRoomActivate();
        if (!gameRoomBro.IsSuccess())
        {
            if(gameRoomBro.GetStatusCode().Equals("404") && gameRoomBro.GetErrorCode().Contains("NotFound"))
            {
                Backend.Match.CreateMatchRoom();
                return;
            }

            GlobalManager.Instance.CreateErrorPopup(gameRoomBro, Application.Quit);
            return;
        }

        if (gameRoomBro.GetStatusCode().Equals("200"))
        {
            gameRoomBro.GetStatusCode();
            Debug.Log(gameRoomBro.GetReturnValuetoJSON().ToJson());
            //재접속 시도 기능 추가 필요, 우선 정보가 출력되는 지 확인만 함.
        }        
    }

    public void OnExitCombat()
    {
        Backend.Match.CancelMatchMaking();
    }

    private void OnMatchInGameStart()
    {
        //캐릭터 생성 및 게임 시작 준비.
        print("게임 스타트");
    }

    private void OnSessionJoinInServer(JoinChannelEventArgs args)
    {
        if (args.ErrInfo.Category != ErrorCode.Success)
        {
//에러 출력지점.
            GlobalManager.Instance.CreatePopup($"인게임 서버 접속 콜백 -> [{args.ErrInfo.Category}/{args.ErrInfo.SocketErrorCode}] : {args.ErrInfo.Reason}", Application.Quit);
            return;
        }

        Backend.Match.JoinGameRoom(currentGameRoomToken);
    }

    private void JoinInGameServer(MatchInGameRoomInfo roomInfo)
    {
        ErrorInfo errorInfo;
        if (!Backend.Match.JoinGameServer(roomInfo.m_inGameServerEndPoint.m_address,
            roomInfo.m_inGameServerEndPoint.m_port, true, out errorInfo))
        {
            GlobalManager.Instance.CreatePopup($"인게임 서버 : False -> [{errorInfo.Category}/{errorInfo.SocketErrorCode}] : {errorInfo.Reason}", Application.Quit);
            return;
        }

        if (errorInfo.Category != ErrorCode.Success)
        {
            GlobalManager.Instance.CreatePopup($"인게임 서버 : True -> [{errorInfo.Category}/{errorInfo.SocketErrorCode}] : {errorInfo.Reason}", Application.Quit);
            return;
        }

        currentGameRoomToken = roomInfo.m_inGameRoomToken;
    }

    private void OnMatchMakingRoomDestory(MatchMakingInteractionEventArgs args)
    {
        if (args.ErrInfo != ErrorCode.Success)
        {
            GlobalManager.Instance.CreatePopup($"매치 대기방 삭제 실패 -> [{args.ErrInfo}] : {args.Reason}", Application.Quit);
            return;
        }

        canvas.sortingOrder = 30;
        characterPage.gameObject.SetActive(true);
        combatBackground.gameObject.SetActive(false);
    }

    private void OnMatchMakingResponse(MatchMakingResponseEventArgs args)
    {
        if (args.ErrInfo == ErrorCode.Success)
        {
            text_Matching.gameObject.SetActive(false);
            JoinInGameServer(args.RoomInfo);
        }
        else if (args.ErrInfo == ErrorCode.Match_InProgress)
        {
            text_Matching.gameObject.SetActive(true);
        }
        else if (args.ErrInfo == ErrorCode.Match_MatchMakingCanceled)
        {
            Backend.Match.LeaveMatchRoom();
        }
        else
        {
            GlobalManager.Instance.CreatePopup($"매치 매칭 실패 -> [{args.ErrInfo}] : {args.Reason}", Application.Quit);
            return;
        }
    }

    private void OnMatchMakingRoomCreate(MatchMakingInteractionEventArgs args)
    {
        if (args.ErrInfo != ErrorCode.Success)
        {
            GlobalManager.Instance.CreatePopup($"매치 대기방 생성 실패 -> [{args.ErrInfo}] : {args.Reason}", Application.Quit);
            return;
        }
        Backend.Match.RequestMatchMaking(MatchType.Random, MatchModeType.OneOnOne, "2022-06-07T02:27:14.774Z");
    }

    private void JoinMatchMakingServer()
    {
        ErrorInfo errorInfo;
        if (!Backend.Match.JoinMatchMakingServer(out errorInfo))
        {
            GlobalManager.Instance.CreatePopup($"매치 서버 : False -> [{errorInfo.Category}/{errorInfo.SocketErrorCode}] : {errorInfo.Reason}", Application.Quit);
            return;
        }

        if (errorInfo.Category != ErrorCode.Success)
        {
            GlobalManager.Instance.CreatePopup($"매치 서버 : True -> [{errorInfo.Category}/{errorInfo.SocketErrorCode}] : {errorInfo.Reason}", Application.Quit);
            return;
        }
    }

    private void OnJoinMatchMakingServer(JoinChannelEventArgs args)
    {
        if (args.ErrInfo.Category != ErrorCode.Success)
        {
            GlobalManager.Instance.CreatePopup($"매치 서버 접속 콜백 -> [{args.ErrInfo.Category}/{args.ErrInfo.SocketErrorCode}] : {args.ErrInfo.Reason}", Application.Quit);
            return;
        }
    }
}

코트 첨부 하였습니다.
혹시 잘못 된 점 있으면 조언 부탁드립니다.

현재 시간에도 테스트를 해보니 계속 에러가 출력되네요.

처음에 NetworkTimeout 에러 출력되고 그다음 재접속하면 재접속 가능한 방 존재가 아닌

ErrInfo : ErrorCode.AuthenticationFailed 에러가 출력되고 여기서 한번 더 재접속 해야

재접속 가능한 방 존재에 걸러지네요. 그리고 수 시간 지난 후에 재접속 해도

다시 접속 시도되서 NetworkTimeout 에러가 출력되는게 아닌 ErrInfo : ErrorCode.AuthenticationFailed 이 것이 출력되네요. 그리고 다시 재접속하면 재접속 가능에 걸러지고요.

근본적으로 제 코드에 문제가 있는 것 같은데요, 저는 게임시작 누르면 바로 게임 시작 되게 하고싶어서
매치 버튼 누르면 방만들고 만들어지자마자 매칭 신청하고 매칭 잡히자마자 게임 서버 접속하고
이런식으로 자동으로 연달아 되게 했는데 이런 부분이 문제가 될 수도 있을가요?

안녕하세요 개발자님.

JoinGameServer 함수의 3번째 인자값, isReconnect의 경우, 현재 해당 요청이 재접속을 위한 요청인지 판단하기 위한 값으로, 재접속이 아닌 단순 게임 매칭을 찾았을 경우에는 해당 값이 false가 되아하며 IsGameRoomActivate() 함수로 방 정보를 찾아 접속시에는 true로 인자값을 대입하셔야합니다.

자동 매칭 접속 구현에 대해서는 문제가 없을 것으로 판단됩니다.


    private void JoinInGameServer(MatchInGameRoomInfo roomInfo)
    {
        ErrorInfo errorInfo;
        if (!Backend.Match.JoinGameServer(roomInfo.m_inGameServerEndPoint.m_address,
            roomInfo.m_inGameServerEndPoint.m_port, true, out errorInfo)) // <- 해당 부분의 true 인자값
        {
            GlobalManager.Instance.CreatePopup($"인게임 서버 : False -> [{errorInfo.Category}/{errorInfo.SocketErrorCode}] : {errorInfo.Reason}", Application.Quit);
            return;
        }

        if (errorInfo.Category != ErrorCode.Success)
        {
            GlobalManager.Instance.CreatePopup($"인게임 서버 : True -> [{errorInfo.Category}/{errorInfo.SocketErrorCode}] : {errorInfo.Reason}", Application.Quit);
            return;
        }

        currentGameRoomToken = roomInfo.m_inGameRoomToken;
    }