에러발생 시 대처사항

디버거에 의해 일시 정지 시 서버 연결이 끊어지는 문제 해결

서버나 클라이언트를 디버깅하기 위해 디버거를 쓰던 중 디버깅 중인 프로그램이 중단점 설정 등에 의해 일시 정지하기 마련입니다.

하지만 ProudNet을 쓰는 경우 이러한 일시 정지 중 수십 초가 지나면 서버와 클라이언트 간의 연결이 끊어집니다. 호스트 간 연결이 비정상적으로 끊어지는 경우 대체적으로 즉시 감지하지만 호스트의 전원이나 통신선을 강제로 뽑아버리는 등의 연결 해제(hard disconnect)를 하는 경우 즉시 감지하지 못합니다.

그리고 일정 시간마다 호스트 간 주고 받는 핑퐁 패킷을 통해 hard disconnect 를 감지합니다. 디버깅 중인 프로그램이 수십 초 동안 일시 정지 상태인 경우도 ProudNet은 hard disconnect로 인식하여 호스트 간의 연결을 해제합니다.

이를 해결하기 위해서는 Proud.CNetServer.SetDefaultTimeoutTimeSec을 써서 hard disconnect를 감지하는 시간을 충분히 길게(예를 들어 한시간) 설정하면 됩니다.

Proud.CNetServer.SetDefaultTimeoutTimeSec을 길게 설정하는 것은 디버깅 중 일때만 권장합니다.

게이머에게 배포되는 버전에 SetDefaultTimeoutTimeSec를 길게 설정할 경우 hard disconnect하는 게이머의 연결 해제 감지를 감지하는데 너무 오랜 시간이 걸릴 수 있습니다.

간혹 hard disconnect를 악용하는 게이머들도 있을 수 있으므로 주의해 주시기 바랍니다.

// 예시

Proud::CNetServer* srv = ...;
#ifdef _DEBUG
srv->SetDefaultTimeoutTimeSec(60*10); // 10분
#endif

빌드 에러가 발생할 경우

#include <atlbase.h>include <ProudNetServer.h> 또는 include <ProudNetClietn.h>를 하기 전에 해보시기 바랍니다. stdafx.h를 사용하는 경우 stdafx.h의 맨 앞단에 include <atlbase.h>를 넣는 것이 좋습니다.

.Net Framework를 사용하는 프로그램은 System.String이라는 심볼이 있으나 ProudNet은 Proud.String 이라는 심볼을 가지고 있습니다. 따라서 .Net Framework를 혼용하는 경우 String이라는 심볼은 System 혹은 Proud 중 하나의 네임스페이스를 명시해야 할 수도 있습니다.

P2P 통신이 갑자기 안되다가 몇 초 뒤에 다시 통신이 재개되는 경우

ProudNet은 P2P 통신을 하던 중에 P2P 연결이 막혀버리면 이를 감지하는데 수 초의 시간이 걸립니다.

만약 P2P 연결이 중간에 막혔다는 것으로 판단되면 P2P 연결을 바이패스 모드로 전환합니다. 이때 주고받지 못했던 Reliable 메시지들이 한꺼번에 주고 받아지며 Unreliable 메시지 들은 소실됩니다.

Assert 대화 상자 막아버리기

ProudNet은 debug build 에서 내부 작동 중 잘못된 사용이 있을 경우 assert failure 대화 상자를 표시할 수 있습니다. 이를 막고 싶다면 assert failure 가 발생할 때 대화 상자 표시 대신 다른 것이 작동하게 설정하셔야 합니다.

직접 만든 함수로 대체도 가능합니다. 아래는 그 예시 입니다.

#include "stdafx.h"
#include <crtdbg.h>
 
int YourReportHook( int reportType, char *message, int *returnValue )
{
    return 1;
}
 
int _tmain(int argc, _TCHAR* argv[])
{
    _CrtSetReportHook(YourReportHook);
    assert(0); // now, this won't show you the message box.
    return 0;
}

CFastHeap 또는 CLookasideAllocator 관련 예외 발생 시 해결 방법

Server, Client 뿐만 아니라 ProudNet의 많은 내부 객체들은 Fast Heap 을 사용하는데, 이 인스턴스를 C++ singleton 으로 둡니다. Fast Heap 을 사용하는 Server, Client 등의 인스턴스를 전역 변수 또는 전역 변수의 멤버 변수로 두면 예외가 발생됩니다.

C++ singleton 으로 만든 인스턴스는 WinMain() 혹은 main()이 리턴하기 전, 의존 객체 관계에 맞춰 파괴됨을 보장하기 때문에 전역 변수가 아닌 C++ singleton 으로 두어야 합니다.

최대 동시접속자 5,000명을 넘기지 못하는 경우

최대 동시 접속자 5,000명을 못 받는 경우라면 다음을 확인해 보시기 바랍니다.

ProudNetClientPlugin.dll 모듈을 찾을 수 없다고 나오는 경우

재배포 패키지가 설치되어 있지 않으면 해당 라이브러리가 경로에 존재 하더라도 오류가 발생할 수 있습니다.

ProudNet 최초 설치 시 마지막 단계에서 재배포 패키지와 CMake를 설치하실 수 있으며, 설치 후에는 ProudNet 설치 경로 하위 Bin폴더에도 재배포 패키지가 들어있으니 해당 파일로 설치하셔도 됩니다.

Last updated