#include "pch.h" #include "ServerSocket.h" CServerSocket::CServerSocket() { m_socket = INVALID_SOCKET; m_clientSocket = INVALID_SOCKET; m_receiveCallback = NULL; } CServerSocket::~CServerSocket() { Close(); } bool CServerSocket::Initialize() { WSADATA wsaData; if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { return false; } return true; } bool CServerSocket::Listen(int port) { m_socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); if (m_socket == INVALID_SOCKET) { return false; } m_addr.sin_family = AF_INET; m_addr.sin_port = htons(port); inet_pton(AF_INET, "127.0.0.1", &m_addr.sin_addr); if (bind(m_socket, (SOCKADDR*)&m_addr, sizeof(m_addr)) == SOCKET_ERROR) { return false; } if (listen(m_socket, SOMAXCONN) == SOCKET_ERROR) { return false; } return true; } bool CServerSocket::Accept() { int addrLen = sizeof(m_addr); m_clientSocket = accept(m_socket, (SOCKADDR*)&m_addr, &addrLen); if (m_clientSocket == INVALID_SOCKET) { return false; } // Start receiving data in a separate thread CreateThread(NULL, 0, [](LPVOID lpParameter) -> DWORD { CServerSocket* pThis = (CServerSocket*)lpParameter; char buffer[1024]; while (true) { int bytesReceived = recv(pThis->m_clientSocket, buffer, 1024, 0); if (bytesReceived > 0) { buffer[bytesReceived] = '\0'; pThis->m_receiveCallback(buffer, bytesReceived); } else { break; } } return 0; }, this, 0, NULL); return true; } void CServerSocket::Close() { if (m_clientSocket != INVALID_SOCKET) { closesocket(m_clientSocket); m_clientSocket = INVALID_SOCKET; } if (m_socket != INVALID_SOCKET) { closesocket(m_socket); m_socket = INVALID_SOCKET; } WSACleanup(); } void CServerSocket::SetReceiveCallback(void (*callback)(char*, int)) { m_receiveCallback = callback; } int CServerSocket::Send(const CHAR* buffer, int length) { return send(m_clientSocket, buffer, length, 0); }