// master socket
// written by jared bruni
// mastersocket 1.0
// written by jared bruni
// [url]www.lostsidedead.com[/url]
#include <windows.h>
#include <winsock.h>
#include<iostream.h>
#define DEFAULT_PORT -1
// initilize and kill winsock
void initwinsock();
void killwinsock();
// structure to automaticly initlize and kill winsock
struct AutoWinSockHandle
{
inline AutoWinSockHandle()
{
initwinsock();
}
inline ~AutoWinSockHandle()
{
killwinsock();
}
};
static AutoWinSockHandle sock_handle; // automaticly construct, and deconstruct
// winsock with this static structure
struct MasterSocket
{
SOCKET socketx; // the socket structure
HWND hwnd; // handle of the window the socket is attached to
UINT SOCKET_ID; // socket ID
void CreateSocket(HWND hwndx,UINT SOCKET_IDx);// create the socket
void Listen(UINT port);// listen on the socket
void Connect(char* ipaddress,UINT port);// connect with the socket
void Send(char* buff, int len); // send data with a connected socket
int Recive(char* buff,int len);// recive data
void Accept(); // accept a incomin socket
const UINT GetID();// get the ID of this socket
void Close();// close the socket
};
// initilze windows sockets
void initwinsock()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
MessageBox(0,"Error Couldnt Init Winsock!","Aborting",MB_ICONINFORMATION);
PostQuitMessage(0);
return;
}
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
WSACleanup( );
return;
}
}
// killwinsock, on lcose
void killwinsock()
{
WSACleanup();
}
// the master socket data structure
void MasterSocket::CreateSocket(HWND hwndx, UINT SOCKET_IDx)
{
hwnd = hwndx;
SOCKET_ID = SOCKET_IDx;
socketx = socket(AF_INET,SOCK_STREAM,0);
WSAAsyncSelect(socketx,hwnd,SOCKET_ID,FD_CONNECT|FD_READ|FD_CLOSE|FD_ACCEPT);
}
// begin listening
void MasterSocket::Listen(UINT port)
{
if(port == DEFAULT_PORT) { port = 7; }
struct sockaddr_in addy;
// begin watching on port 7
addy.sin_family = AF_INET;
addy.sin_port = htons(port);
addy.sin_addr.s_addr = INADDR_ANY; //inet_addr("172.129.243.252");
bind(socketx,(struct sockaddr*)&addy,sizeof(addy));
listen(socketx,5);
}
// connect to a remote socket
void MasterSocket::Connect(char* ipaddress,UINT port)
{
struct sockaddr_in addy2;
if(port == DEFAULT_PORT) { port = 7; }
addy2.sin_family = AF_INET;
addy2.sin_port = htons(port);
addy2.sin_addr.s_addr = inet_addr(ipaddress);
connect(socketx,(struct sockaddr*)&addy2,sizeof(addy2));
}
// accept a request from remote socket
void MasterSocket::Accept()
{
struct sockaddr cli_addr;
int clilen;
clilen = sizeof(cli_addr);
socketx = accept(socketx,(struct sockaddr*)&cli_addr,&clilen);
}
// send data once socket is connected
void MasterSocket::Send(char* buff, int len)
{
send(socketx,buff,len,0);
}
// recive data from a connected socket
int MasterSocket::Recive(char* buff,int len)
{
return recv(socketx,buff,len,0);
}
// get the ID of a given socket, for the wndproc callback
const UINT MasterSocket::GetID()
{
return (const UINT)SOCKET_ID;
}
// close an open socket
void MasterSocket::Close()
{
closesocket(socketx);
}
int main()
{
initwinsock();
MasterSocket.Listen(10);
return 0;
}