크래시 매크로 추가 in ServerCore

CoreMacro.h 를 만들어 넣어줬다.

널포인터에 접근해서 일부터 터지게 만드는 매크로.

#pragma once

/*----------------------------------------------------------------------------*\
|                                 CRASH                                        |
\*----------------------------------------------------------------------------*/

#define CRASH(cause)						\
{											\
	uint32* crash = nullptr;				\
	__analysis_assume(crash != nullptr);	\
	*crash = 0xDEADBEEF;					\
}

#define ASSERT_CRASH(expr)			\
{									\
	if (!(expr))					\
	{								\
		CRASH("ASSERT_CRASH");		\
		__analysis_assume(expr);	\
	}								\
}

SocketUtils 클래스 추가 in ServerCore

소켓을 쓰려면 WSAStartup으로 초기화해야하니 SocketUtils를 만들어 여기서 해주자.

만드는 김에 IO확장함수들도 가져오자.

그런김에 나중에 쓸 함수들도 만들어둔다. 게임서버강의를 많이 참조했는데, 강의에서 구현한 것 중에 안쓰는기능은 뺐다.

 

bind와 listen은 아직 NetAddress 클래스를 안만들어서 대충 만들어놓고 놔뒀다. 나중에 바꿔주자.

#pragma once

#include <winsock2.h>
#include <mswsock.h>

class SocketUtils
{
public:
	static LPFN_CONNECTEX ConnectEx;
	static LPFN_DISCONNECTEX DisconnectEx;
	static LPFN_ACCEPTEX AcceptEx;

public:
	static bool Init();
	static void Clear();

	static SOCKET CreateSocket();
	static void CloseSocket(SOCKET sock);
	static int BindSocket(int sock);
	static int ListenSocket(int sock);
	static bool SetReuseAddress(SOCKET socket, bool flag);
	static bool SetTcpNoDelay(SOCKET socket, bool flag);

private:
	static int32 LoadExtensionFunction(GUID guid, LPVOID* func);
	static WSADATA wsaData;

	template<typename T>
	static bool SetSockOpt(SOCKET socket, int32 level, int32 optName, T optVal)
	{
		return SOCKET_ERROR != ::setsockopt(socket, level, optName, reinterpret_cast<char*>(&optVal), sizeof(T));
	}
};
#include "pch.h"
#include "SocketUtils.h"

#pragma comment(lib, "ws2_32.lib")
#pragma comment(lib, "mswsock.lib")

WSADATA				SocketUtils::wsaData;

LPFN_CONNECTEX		SocketUtils::ConnectEx = nullptr;
LPFN_DISCONNECTEX	SocketUtils::DisconnectEx = nullptr;
LPFN_ACCEPTEX		SocketUtils::AcceptEx = nullptr;

bool SocketUtils::Init()
{
	ASSERT_CRASH(!WSAStartup(MAKEWORD(2, 2), &wsaData));

	ASSERT_CRASH(LoadExtensionFunction(WSAID_ACCEPTEX, reinterpret_cast<LPVOID*>(&AcceptEx)) == 0);
	ASSERT_CRASH(LoadExtensionFunction(WSAID_CONNECTEX, reinterpret_cast<LPVOID*>(&ConnectEx)) == 0);
	ASSERT_CRASH(LoadExtensionFunction(WSAID_DISCONNECTEX, reinterpret_cast<LPVOID*>(&DisconnectEx)) == 0);
	return true;
}

void SocketUtils::Clear()
{
	::WSACleanup();
}

SOCKET SocketUtils::CreateSocket()
{
	return WSASocket(AF_INET, SOCK_STREAM, IPPROTO_TCP, NULL, 0, WSA_FLAG_OVERLAPPED);
}

void SocketUtils::CloseSocket(SOCKET sock)
{
	if (sock == INVALID_SOCKET)
		return;
	closesocket(sock);
	sock = INVALID_SOCKET;
}

int SocketUtils::BindSocket(int sock)
{
	return 0;
}

int SocketUtils::ListenSocket(int sock)
{
	return 0;
}

bool SocketUtils::SetReuseAddress(SOCKET socket, bool flag)
{
	return SetSockOpt(socket, SOL_SOCKET, SO_REUSEADDR, flag);
}

bool SocketUtils::SetTcpNoDelay(SOCKET socket, bool flag)
{
	return SetSockOpt(socket, SOL_SOCKET, TCP_NODELAY, flag);
}

int32 SocketUtils::LoadExtensionFunction(GUID guid, LPVOID* func)
{
	SOCKET dummySocket = CreateSocket();
	if (dummySocket == INVALID_SOCKET)
		return false;
	DWORD bytes = 0;
	int32 ret = WSAIoctl(dummySocket, SIO_GET_EXTENSION_FUNCTION_POINTER, &guid, sizeof(guid), func, sizeof(*func), &bytes, NULL, NULL);
	CloseSocket(dummySocket);
	return ret;
}

Utils 클래스 추가 in ServerCore

앞으로 이런저런 잡다한 유틸함수들 넣어놓도록 하자.

class Utils
{
public:
	static int HandleError(const char* errstr);
};

int Utils::HandleError(const char* errstr)
{
	cerr << errstr << endl;
	exit(1);
	return 1;
}

이외에  NetAddress IocpCore 클래스만 추가함. 

지금까지의 버전

https://github.com/Dodontak/Project_Island_GameServer/commit/65ef21060739e6ffb5e1d2f04d6967badfea994c

 

Feat: SocketUtils, Utils 추가 등 · Dodontak/Project_Island_GameServer@65ef210

SocketUtils 추가 - 각종 소켓 생성, 사용, 변경, 소멸을 담당함. - Init에서 WSAStartup 함 - Init에서 AccpetEx, ConnectEx, DisconnectEx 가져옴 Utils 추가 - 앞으로 만들어질 잡다한 유틸함수들 여기 일단 넣어놓을

github.com

 

'프로젝트 > Project_Island' 카테고리의 다른 글

27. IOCP accept, recv까지 구현  (0) 2026.03.28
26. NetAddress  (0) 2026.03.27
24. 환경설정  (0) 2026.03.25
23. 게임서버 만들기의 시작  (0) 2026.03.24
나중에 인증서버에서 할 일  (0) 2026.03.17

+ Recent posts