This repository has been archived on 2021-07-03. You can view files and clone it, but cannot push or open issues or pull requests.
rts/rts/sockwrap.h
2013-03-03 00:35:44 -06:00

149 lines
3.3 KiB
C++

#include <stdio.h>
#include <WinSock2.h>
#include <process.h>
#pragma comment(lib, "ws2_32.lib")
#ifndef SOCKWRAPH
#define SOCKWRAPH
class Server {
SOCKET s;
int port;
struct sockaddr_in addr;
u_long Block, nonBlock;
int blen;
public:
Server(int port, int buflen);
~Server();
void Init(int port, int buflen);
int Send(char *msg, struct sockaddr_in caddr);
int Recv(char *buf, struct sockaddr_in *raddr);
void SetBlocking(bool);
bool WouldBlock();
};
Server::Server(int port, int buflen) {
Init(port, buflen);
}
void Server::Init(int port, int buflen) {
WSAData w;
WSAStartup(0x0202, &w);
s = socket(AF_INET, SOCK_DGRAM, 0);
memset((void *)&addr, 0, sizeof(addr));
addr.sin_addr.S_un.S_addr = INADDR_ANY;
addr.sin_family = AF_INET;
addr.sin_port = htons(port);
if(bind(s, (struct sockaddr*)&addr, sizeof(struct sockaddr_in)) != 0)
printf("%i\n", WSAGetLastError());
Block = 0;
nonBlock = 1;
blen = buflen;
}
int Server::Send(char *msg, struct sockaddr_in caddr) {
return sendto(s, msg, blen, 0, (struct sockaddr *)&caddr, sizeof(caddr));
}
int Server::Recv(char *buf, struct sockaddr_in *raddr) {
int raddrs = sizeof(struct sockaddr_in);
return recvfrom(s, buf, blen, 0, (struct sockaddr *)raddr, &raddrs);
}
void Server::SetBlocking(bool ean) {
u_long toggle = !ean;
ioctlsocket(s, FIONBIO, &toggle);
}
bool Server::WouldBlock() {
return WSAGetLastError() == WSAEWOULDBLOCK;
}
Server::~Server() {
closesocket(s);
WSACleanup();
}
class Client {
typedef void (*listenFunc)(char*);
SOCKET s;
int port;
struct sockaddr_in saddr, laddr;
unsigned int ltid;
listenFunc lf;
static void ListenThread(void*);
bool tFlag;
u_long Block, nonBlock;
int blen;
public:
Client(char *ip, int port, int buflen, listenFunc l);
~Client();
void Init(char *ip, int port, int buflen, listenFunc l);
void StartListenThread();
void StopListenThread();
int Send(char *msg);
};
Client::Client(char *ip, int port, int buflen, listenFunc l) {
Init(ip, port, buflen, l);
}
void Client::Init(char *ip, int port, int buflen, listenFunc l) {
WSAData w;
WSAStartup(0x0202, &w);
s = socket(AF_INET, SOCK_DGRAM, 0);
memset((void *)&saddr, 0, sizeof(saddr));
saddr.sin_addr.S_un.S_addr = inet_addr(ip);
saddr.sin_family = AF_INET;
saddr.sin_port = htons(port);
memset((void *)&laddr, 0, sizeof(laddr));
laddr.sin_family = AF_INET;
laddr.sin_port = htons(0);
laddr.sin_addr.S_un.S_addr = INADDR_ANY;
if(bind(s, (struct sockaddr*)&laddr, sizeof(struct sockaddr_in)) != 0)
printf("%i\n", WSAGetLastError());
lf = l;
ltid = NULL;
tFlag = false;
Block = 0;
nonBlock = 1;
blen = buflen;
}
void Client::StartListenThread() {
if(ltid == NULL)
ltid = _beginthread(this->ListenThread, 0, (void *)this);
}
void Client::ListenThread(void *a) {
Client *sw = (Client*)a;
ioctlsocket(sw->s, FIONBIO, &sw->nonBlock);
char *buf = new char[sw->blen];
int slen = sizeof(sw->saddr);
while(sw->tFlag == false) {
recvfrom(sw->s, buf, sw->blen, 0, (struct sockaddr *)&sw->saddr, &slen);
if(WSAGetLastError() != WSAEWOULDBLOCK)
sw->lf(buf);
}
sw->tFlag = false;
_endthread();
}
void Client::StopListenThread() {
if(ltid != NULL) {
tFlag = true;
ltid = NULL;
}
}
int Client::Send(char *msg) {
return sendto(s, msg, blen, 0, (struct sockaddr *)&saddr, sizeof(saddr));
}
Client::~Client() {
tFlag = true;
closesocket(s);
WSACleanup();
}
#endif