Programmed by me(jetamay) for MPGH.NET.
Under MIT license, enjoy. Only that you must notify users about MPGH.Net when using it.
This class eases communication with a server, and prevents any problems in a blocking socket, using a callback instead. Uses a TCP stream connection. Include ws2_32.lib and wsock32.lib in your projects provided in the windows platform sdk.
Header :
[highlight=cpp]
#pragma once
#include <winsock.h>
#include "engineDef.h"
#include "CNetworkManager.h"
typedef void (*MESSAGECALLBACK)(char* message);
class CNetworkManager {
private:
HANDLE hRecvThread;
WSADATA winsockData;
SOCKADDR_IN socketAddress;
public:
SOCKET hSocket;
MESSAGECALLBACK msgCallback;
CNetworkManager(MESSAGECALLBACK callback);
int ConnectToServer(char* address, int port);
int SendMessage(char* message);
void StopRecvThread();
void StartRecvThread();
~CNetworkManager();
};
static void RecvLoop(CNetworkManager* callerClass);
[/highlight]
Source :
[highlight=cpp]
#include "stdafx.h"
#include <winsock.h>
#include "engineDef.h"
#include "CNetworkManager.h"
#define SOCKET_VERSION 2
CNetworkManager::CNetworkManager(MESSAGECALLBACK callback) {
msgCallback = callback;
hRecvThread = CreateThread(0,0,(LPTHREAD_START_ROUTINE)RecvLoop, this,CREATE_SUSPENDED,0);
WSAStartup(MAKEWORD(SOCKET_VERSION,0), &winsockData);
hSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
}
CNetworkManager::~CNetworkManager() {
SuspendThread(hRecvThread);
CloseHandle(hRecvThread);
closesocket(hSocket);
WSACleanup();
}
int CNetworkManager::ConnectToServer(char* address, int port) {
socketAddress.sin_family = AF_INET;
socketAddress.sin_addr.S_un.S_addr = inet_addr(address);
socketAddress.sin_port = htons(port);
if(connect(hSocket, (sockaddr*) &socketAddress, sizeof(socketAddress)) != 0)
return -1;
else
return 1;
}
int CNetworkManager::SendMessage(char* message) {
send(hSocket, message, sizeof(message),0);
return 1;
}
void CNetworkManager::StartRecvThread() {
ResumeThread(hRecvThread);
}
void CNetworkManager::StopRecvThread() {
SuspendThread(hRecvThread);
}
static void RecvLoop(CNetworkManager* callingClass) {
char* buffer = new char[300];
while(true) {
ZeroMemory(buffer, 300);
int recvBytes = recv(callingClass->hSocket, buffer, 300, 0);
callingClass->msgCallback(buffer);
}
delete buffer;
}
[/highlight]