LOGIN • JOININ

SIMPLE SERVER

[Tutorials/[Network] 1. Socket classes/Server/Tutorial_SocketServer01_SimpleServer]



1... Accept용 Socket 클래스 정의

class CSocket : public CGNet::Socket::CTCP<>
{
	virtual void OnConnect() override
	{
		printf("Connected\n");
	}

	virtual void OnDisconnect(uint32_t /*_Reason*/) override
	{
		printf("Disconnected\n");
	}

	virtual int OnMessage(CGMSG& /*_MSG*/) override
	{
		printf("Message Received\n");

		return	0;
	}
};

CGNet::Socket::CTCP 클래스를 상속받아 CSocket 클래스를 정의했습니다. 

이 때의 CSocket은 Client 접속 1개마다 1개씩 생성되는 객체 클래스로 1개의 클라이언트 접속에 해당합니다. 
따라서 이 CSocket 객체의 Send(...)함수를 호출하면 접속된 상대에게 데이터를 전송하게 되며 CloseSocket()을 호출하면 해당 접속이 끊기게 됩니다.
CSocket 클래스의 정의를 할 때 

또 접속 시, 접속 종료 시, 메시지가 전달되어 왔을 시 호출되는 가상함수인 OnConnect(), ConDisconnect(), OnMessage() 함수를 재정의할 수 있습니다.
(추가적으로 OnReceive(...), OnFailConnect(...) 등등 몇가지 재정의 가능한  순수 가능 함수가 있으나 실질적으로 거의 OnConnect(), OnDisconnect(), OnMessage()만 사용합니다.)


① OnConnect()는 ‘접속이 되었을 때’ 호출되는 함수이며 

② OnDisconnect()는 ‘접속이 종료되었을 때’ 호출되는 함수이며 

③ OnMessage()는 ‘메시지가 전송되어 왔을 때’ 호출되는 함수입니다. 



2... 서버 시작  Listen!

int _tmain(int argc, _TCHAR* argv[])
{
	// 1) Acceptor 객체를 생성한다.
	auto	pacceptor	 = NEW<CGNet::CAcceptor<CSocket>>();

	// 2) 10000번 포트에 Listen을 시작한다.
	pacceptor->Start(10000);

	// 3) ESC키를 누를 때까지 대기한다.
	while(_getch()!=27);

	// 4) Acceptor를 닫는다.
	pacceptor->Stop();
}


1) ‘CGNet::CAcceptor’ 객체를 생성줍니다. 
2) 포트번호를 주어 Start만 하면 됩니다. 여기서는 10000번 포트를 Listen하도록 오픈했습니다.

     -새로운 접속이 들어오면 CSocket 객체를 만들어 그 객체의 ‘OnConnect()’함수를 호출해 줍니다.

    - 접속된 상대로부터 메시지가 전송되어 오면 ‘CSocket’의 ‘OnMessage()’함수가 호출됩니다. 
    - 접속이 종료되면 ‘CSocket’의 ‘OnDisconnect()’함수가 호출됩니다.
3) ESC를 누를 때까지 대기합니다. (ESC를 누르면 서버 종료)
4) acceptor를 Stop하고 종료합니다.

[Full Source]  TutorialSimpleServer1.cpp
#include "stdafx.h"
#include "CGNetSocketTemplates.h"


class CSocket : public CGNet::Socket::CTCP<>
{
	// 1) 접속 시 호출되는 Hook함수
	virtual void OnConnect() override
	{
		printf("Connected\n");
	}

	// 2) 접속 종료 시 호출되는 Hook함수
	virtual void OnDisconnect(uint32_t) override
	{
		printf("Disconnected\n");
	}

	// 3) 메시지가 전송되어 왔을 때 호출 되는 함수.
	virtual int OnMessage(CGMSG& /*_MSG*/) override
	{
		printf("Message Received\n");

		return	0;
	}
};

int _tmain(int /*argc*/, _TCHAR* /*argv*/[])
{
	// 1) CSocket을 사용하는 Acceptor 객체를 생성한다.
	auto	pacceptor	 = NEW<cgnet::cacceptor <csocket>>();

	// 2) Acceptor를 20000번 포트에 Listen하기 시작한다.
	pacceptor->Start(20000);

	// 3) ESC키를 누를 때까지 대기한다.
	while(_getch()!=27);

	// 4) Acceptor를 닫는다.
	pacceptor->Stop();

	return 0;
}