인프런 영문 브랜드 로고
인프런 영문 브랜드 로고

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

이건형님의 프로필 이미지
이건형

작성한 질문수

[C++과 언리얼로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

Server Service

_ maxSessionCount 관련하여 질문드립니다.

해결된 질문

작성

·

339

0

안녕하세요 루키스님 강의 정말 잘 듣고있습니다.

처음에 제가 강의를 들으면서 이해한 바로는 _maxSessionCount가 서버에 허용 가능한 최대 세션의 갯수를 의미하는 값으로 생각을 했습니다. 그래서 아래와 같이 ServerService 객체를 생성하면서 마지막 인자값으로 10을 넣으면 최대 10개의 클라이언트가 접속가능하다고 생각했습니다.

ServerServiceRef service = make_shared<ServerService>(
	NetAddress(L"127.0.0.1", 7777),
	make_shared<IocpCore>(),
	[]() -> SessionRef { return make_shared<GameSession>(); },	// TODO : SessionManager 등
	10);

하지만 Listener에서 maxSessionCount만큼 AcceptEvent를 생성하여 RegisterAccept를 해주고

const int32 acceptCount = _service->GetMaxSessionCount();
for (int32 i = 0; i < acceptCount; i++)
{
	AcceptEvent* acceptEvent = new AcceptEvent();
	acceptEvent->owner = shared_from_this();
	_acceptEvents.push_back(acceptEvent);
	RegisterAccept(acceptEvent);
}

그 뒤에 클라이언트가 접속하면 Listener에서 Dispatch하여 ProcessAccept를 실행하면 아래와 같이 미리 생성했던 Session에 정보를 업데이트하고 난 후에 다시 RegisterAccept를 해줍니다.

void Listener::ProcessAccept(AcceptEvent* acceptEvent)
{
	/* 생략 */

	session->SetNetAddress(NetAddress(sockAddress));
	session->ProcessConnect();
	// session->OnRecv();
	cout << "Client Connected " << session->_socket << endl;

	// TODO

	RegisterAccept(acceptEvent);
}

이렇게 된다면 AcceptEvent가 재사용되어 또 Session을 만들어 다른 클라이언트의 접속을 받을 수 있게 되는데 그렇다면 무한정으로 Session을 받을 수 있다는 의미가 아닌지 궁금합니다. 실제로 ServerService의 _maxSessionCount보다 DummyClient의 _maxSessionCount를 더 크게 하여 실행했을 때, DummyClient 갯수만큼 세션을 생성하는 것을 확인했습니다.

즉 _maxSessionCount가 의미하는 것이 서버에서 최대로 허용하는 세션의 갯수가 아니라 서버가 한번에 Accept 처리할 수 있는 최대 세션의 갯수인 것인지 궁금합니다.

답변 1

0

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

maxSessionCount의 '원래' 의미는 정말 Client 동접을 의미하나
강의 코드에서 이를 넘어서는 접속을
끊어버리는 것까지는 구현이 안 되어 있던 것으로 기억합니다.

acceptCount를 maxSessionCount로 하는 이유는,
최대 동접과는 무관하게 동시에 사람들이 몰리면
(서버를 오픈하자마자 사람들이 엄청 몰리게 될 경우)
튕겨내는 현상을 방지하기 위함인데요.

일종의 acceptEvent 풀링? 같은 개념이라 볼 수 있겠습니다.
이전 프로젝트에선 maxSessionCount의 1/3 ~ 1/2 정도를 사용했던 기억이 있네요.


이건형님의 프로필 이미지
이건형

작성한 질문수

질문하기