언리얼4로 클라이언트를 구현하고 있습니다.
간단하게 접속이랑 멍텅구리 프록시/스텁 붙이는거까지만 했는데 오류가 있어 문의 드립니다.
GameInstance에 작성하였구요. 실행 → 서버 접속 성공 까지는 잘 뜨는데
클라이언트 종료 시
Rmi Stub/Proxy Still in use by ProudNet Core cannot be destroyed! Destroy CNetClient or CNetServer First !
라는 오류가 뜹니다
혹시 netClient를 파괴해주는 코드가 따로 있나요? 오류 말고도 혹시 아래 코드에 관해 조언이 가능하시다면 부탁 드리겠습니다.
아래는 GameInstance.h입니다.
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#define WIN32_LEAN_AND_MEAN
#include "CoreMinimal.h"
#include "Engine/GameInstance.h"
#include "Windows.h"
#include "ProudNetClient.h"
#include "CTSHeader_proxy.h"
#include "STCHeader_stub.h"
#include "TestGameInstance.generated.h"
/**
*
*/
UCLASS()
class PARKSOLBIN_API UTestGameInstance : public UGameInstance
{
GENERATED_BODY()
public:
virtual void Init() override;
virtual void Shutdown() override;
TSharedPtr<Proud::CNetClient> netClient;
FTimerHandle netClientLoopHandle;
UFUNCTION()
void netClientLoop();
CTSHeader::Proxy ctsProxy;
STCHeader::Stub stcStub;
};
아래는 GameInstance.cpp입니다.
// Fill out your copyright notice in the Description page of Project Settings.
#include "TestGameInstance.h"
#include "Engine/Engine.h"
#include "TimerManager.h"
#include "CTSHeader_common.cpp"
#include "CTSHeader_proxy.cpp"
#include "STCHeader_common.cpp"
#include "STCHeader_stub.cpp"
using namespace Proud;
void UTestGameInstance::Init()
{
Super::Init();
netClient = TSharedPtr<CNetClient>(CNetClient::Create());
GetWorld()->GetTimerManager().SetTimer(netClientLoopHandle, this, &UTestGameInstance::netClientLoop, 0.1f, true);
CNetConnectionParam m_param;
m_param.m_serverIP = _PNT("127.0.0.1");
m_param.m_serverPort = 44444;
m_param.m_protocolVersion = Guid({ 0x5dca93f4, 0x8133, 0x44a0, { 0xb5, 0x7b, 0x75, 0x7d, 0x9c, 0x78, 0xd5, 0x2e} });
netClient->AttachProxy(&ctsProxy);
netClient->AttachStub(&stcStub);
netClient->OnJoinServerComplete = [&](ErrorInfo *info, const ByteArray &replyFromServer)
{
if (info->m_errorType == ErrorType::ErrorType_Ok)
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("접속 성공"));
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("접속 실패"));
}
};
if (netClient->Connect(m_param) == true)
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Green, TEXT("접속 시도 성공"));
}
else
{
GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT("접속 시도 실패"));
}
}
void UTestGameInstance::netClientLoop()
{
netClient->FrameMove();
}
void UTestGameInstance::Shutdown()
{
Super::Shutdown();
// netClient->Disconnect(); 를 써봤는데 똑같음
}
서버 기록입니다. 예외가 있으면 표시되게 했는데 퇴장까지도 멀쩡히 찍히네요
- [23:35:43] [정보] 서버 시작.
- [23:40:24] [정보] 클라이언트 참여: 3
- [23:40:26] [정보] 클라이언트 퇴장: 3
- [23:40:28] [정보] 클라이언트 참여: 4
- [23:40:29] [정보] 클라이언트 퇴장: 4
- [23:40:31] [정보] 서버 정지.
- [23:40:33] [정보] 서버 시작.
- [23:40:34] [정보] 클라이언트 참여: 3
- [23:40:37] [정보] 서버 정지.
- [23:53:39] [정보] 서버 시작.
- [23:53:41] [정보] 서버 정지.
- [23:57:02] [정보] 서버 시작.
- [23:57:04] [정보] 클라이언트 참여: 3
- [23:57:06] [정보] 클라이언트 퇴장: 3
- [23:58:11] [정보] 클라이언트 참여: 4
- [23:58:34] [정보] 클라이언트 퇴장: 4
- [23:59:13] [정보] 클라이언트 참여: 5