JavaScript.Projects/source/apps/WebAssembly_Ports/Current.Port/wasm_port/mx/mxsocket.cpp
Source: JavaScript.Projects/source/apps/WebAssembly_Ports/Current.Port/wasm_port/mx/mxsocket.cpp
/*
MX library.
http://lostsidedead.com/svn
libmx written by jared bruni, it is wrappers around SDL
and other api's to provide a set of classes and functions
to produce multi media applications, using object oriented
techniques.
(C) 2008 LostSideDead
*/
#include "mxsocket.h"
namespace mx
{
mxSocket::mxSocket()
{
current_socket = 0;
connected = false;
}
mxSocket::~mxSocket()
{
}
mxSocket::mxSocket(mx_socket nsock)
{
current_socket = nsock;
connected = true;
}
mxSocket::mxSocket(const mxSocket &nsock)
{
current_socket = nsock.current_socket;
connected = nsock.connected;
}
mxSocket& mxSocket::operator=(const mxSocket &sock)
{
current_socket = sock.current_socket;
connected = sock.connected;
return *this;
}
bool mxSocket::createSocket()
{
current_socket = socket(AF_INET,SOCK_STREAM,0);
return true;
}
bool mxSocket::listenAt(int port)
{
static struct sockaddr_in addy;
memset((char*)&addy,0, sizeof(addy));
addy.sin_port = htons(port);
addy.sin_family = AF_INET;
addy.sin_addr.s_addr = INADDR_ANY;
int yup = 1;
setsockopt(current_socket, SOL_SOCKET,SO_REUSEADDR,(const char*)&yup,sizeof(yup));
bind(current_socket, (struct sockaddr *)&addy, sizeof(addy));
listen(current_socket,5);
return true;
}
mx_socket mxSocket::acceptNewSocket(std::string &ip)
{
#ifdef _WIN32
int caddy_len;
#else
socklen_t caddy_len;
#endif
static struct sockaddr_in caddy;
int s;
s = accept(current_socket, (struct sockaddr *)&caddy, &caddy_len);
ip = std::string(inet_ntoa(caddy.sin_addr));
connected = true;
return s;
}
mx_socket mxSocket::acceptsocket()
{
#ifdef _WIN32
int caddy_len;
#else
socklen_t caddy_len;
#endif
mx_socket SOCK;
struct sockaddr_in caddy;
SOCK = accept(current_socket, (struct sockaddr *)&caddy, &caddy_len);
connected = true;
return SOCK;
}
bool mxSocket::connectTo(std::string where, unsigned int port)
{
struct sockaddr_in saddy;
saddy.sin_port = htons(port);
saddy.sin_addr.s_addr = inet_addr(where.c_str());
saddy.sin_family = AF_INET;
if(connect(current_socket, (const sockaddr*)&saddy, sizeof(sockaddr_in)) == -1) {
std::cout << "error: could not connect: \n";
return false;
}
connected = true;
return true;
}
ssize_t mxSocket::Read(void *data, size_t size)
{
size_t len = size;
size_t total = 0;
int cur_;
char *cdata = (char*)data;
while ( (len != 0) && ( (cur_ = recv(current_socket, cdata, len, 0) ) != 0) )
{
if(cur_ == -1) {
std::cerr << "mxsocket: error on read\n";
return -1;
}
len -= cur_;
cdata += cur_;
total += cur_;
}
return total;
}
ssize_t mxSocket::Write(void *data, size_t size)
{
size_t len = size;
size_t total = 0;
int cur_;
char *cdata = (char*)data;
while ( (len != 0) && (( cur_ = send(current_socket, cdata, len, 0) ) != 0) )
{
if(cur_ == -1) {
std::cerr << "mxsocket: error on write\n";
return -1;
}
len -= cur_;
cdata += cur_;
total += cur_;
}
return total;
}
int mxSocket::closeSocket()
{
#ifdef _WIN32
return closesocket(current_socket);
#else
return close(current_socket);
#endif
return 1;
}
}