지난번에 accept recv send connect disconnect를 모두 만들었다.

근데 connect가 제대로 되는지는 더미클라이언트를 만들지 않아서 확인해볼 수가 없었다.

그러니까 이번엔 더미클라이언트들 만들어보자.



Service
- 더미클라이언트 동작을 위해 서비스를 두개로 분할함. ServerService, ClientService

class ServerService : public Service
{
public:
	ServerService(NetAddress listenerAddr);
	virtual void Start() override;

};

class ClientService : public Service
{
public:
	ClientService(NetAddress serverAddr, int32 clientCount);

	virtual void Start() override;
private:
	int32 _clientCount;
};
/*----------------------------------------------------------------------------*\
|                               ServerService                                  |
\*----------------------------------------------------------------------------*/
ServerService::ServerService(NetAddress listenerAddr) : Service(listenerAddr)
{
}

void ServerService::Start()
{
	SocketUtils::Init();

	ListenerRef listener = make_shared<Listener>(shared_from_this());

	listener->StartAccept();
}

/*----------------------------------------------------------------------------*\
|                               ClientService                                  |
\*----------------------------------------------------------------------------*/
ClientService::ClientService(NetAddress serverAddr, int32 clientCount)
	: Service(serverAddr), _clientCount(clientCount) {}

void ClientService::Start()
{
	SocketUtils::Init();

	for (int32 i = 0; i < _clientCount; i++)
	{
		SessionRef session = CreateSession();

		_iocpCore->RegisterHandle(session);

		session->SetAddr(_netAddress);

		session->RegisterConnect();
	}
}

 

DummyClient

void WorkerThread(ServiceRef service)
{
	while (1)
	{
		service->GetIocpCore()->Dispatch();
	}
}

int main()
{
	cout << "=== DummyClient ===" << endl;
	this_thread::sleep_for(chrono::seconds(1));
	ThreadManager tManager;
	ClientServiceRef service = make_shared<ClientService>(
		NetAddress("127.0.0.1", 7777),
		10
	);

	service->Start();

	for (int i = 0; i < 5; i++)
	{
		tManager.Launch([service]() {
			WorkerThread(service);
			}
		);
	}
	while (true)
	{
		this_thread::sleep_for(chrono::seconds(1));
		string msg = "Hello Iocp Server!";

		SendBufferRef sendBuffer = make_shared<SendBuffer>((BYTE*)msg.c_str(), msg.length());
		service->broad_cast_test(sendBuffer);
	}
}

 


테스트

더미클라이언트를 10개로 놓고, 1초마다 브로드캐스트로 Hello Iocp Server! 를 send하도록 했는데, 잘 된다.

 

일단 더미클라이언트로 connect가 잘 작동하는지 테스트해보는건 성공적이었지만, 매우 심각한 문제를 발견헀다.

더미클라이언트를 종료하면 10개의 세션이 distructed 되어야 하는데, 그보다 적은 수의 세션만 distructed되는 것.

 

이 문제도 이번에 해결을 해보려했는데, 쉽지 않은 문제같아서 다음번 과제로 삼자.

세션 10개가 생성 되고, 7개만 소멸 되고있다.

아마도 session이 정적 변수로 들고있는 event 클래스들이 sessionRef를 참조하고있는데, 종료상황에서 그걸 제대로 release하지 못하는 문제로 보이는데 생각보다 쉽게 해결이 안됐다.


현재까지의 git 버전

 

 

Feat: 더미클라이언트 · Dodontak/Project_Island_GameServer@5b9ceaf

DummyClient - 더미클라이언트 만듦. Service - 더미클라이언트 동작을 위해 서비스를 두개로 분할함. ServerService, ClientService - 서버용으로만 쓰이던 함수, 변수명을 중립적으로 변경. Session - _service가 Cl

github.com

 

+ Recent posts