크래시 매크로 추가 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 클래스만 추가함.
지금까지의 버전
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 |