Danbias/Code/Network/NetworkDependencies/Connection.cpp

137 lines
2.4 KiB
C++
Raw Normal View History

2013-11-19 12:38:13 +01:00
#include "Connection.h"
#include <winsock2.h>
#include <iostream>
2013-11-26 13:45:03 +01:00
#include <string>
using namespace Oyster::Network;
2013-11-19 12:38:13 +01:00
Connection::~Connection()
{
closesocket( this->socket );
2013-11-19 12:38:13 +01:00
}
2013-11-26 13:45:03 +01:00
int Connection::Connect(unsigned short port , const char serverName[])
2013-11-19 12:38:13 +01:00
{
2013-11-22 09:17:07 +01:00
struct hostent *hostEnt;
if((hostEnt = gethostbyname(serverName)) == NULL)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
2013-11-19 12:38:13 +01:00
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
2013-11-22 09:17:07 +01:00
server.sin_addr.s_addr = *(unsigned long*) hostEnt->h_addr;
2013-11-19 12:38:13 +01:00
if(connect(this->socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
//connection succesfull!
2013-11-26 13:45:03 +01:00
return 0;
2013-11-19 12:38:13 +01:00
}
2013-11-26 13:45:03 +01:00
int Connection::InitiateServer(unsigned short port)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
int errorCode = 0;
if((errorCode = initiateSocket()) != 0)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
return errorCode;
2013-11-19 12:38:13 +01:00
}
struct sockaddr_in server;
server.sin_family = AF_INET;
server.sin_port = htons(port);
server.sin_addr.s_addr = INADDR_ANY;
if(bind(this->socket, (sockaddr*)&server, sizeof(server)) == SOCKET_ERROR)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
errorCode = WSAGetLastError();
closesocket(this->socket);
2013-11-26 13:45:03 +01:00
return errorCode;
2013-11-19 12:38:13 +01:00
}
2013-11-22 09:17:07 +01:00
//not our Listen function! its trying to keep our socket open for connections
if(listen(this->socket, 5) == SOCKET_ERROR)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
errorCode = WSAGetLastError();
closesocket(this->socket);
2013-11-26 13:45:03 +01:00
return errorCode;
2013-11-19 12:38:13 +01:00
}
//Server started!
2013-11-26 13:45:03 +01:00
return 0;
}
2013-11-26 13:45:03 +01:00
int Connection::InitiateClient()
{
2013-11-26 13:45:03 +01:00
int errorCode;
return initiateSocket();
2013-11-19 12:38:13 +01:00
}
2013-11-26 13:45:03 +01:00
int Connection::Disconnect()
2013-11-19 12:38:13 +01:00
{
closesocket(this->socket);
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
2013-11-26 13:45:03 +01:00
int Connection::Send(const unsigned char message[])
2013-11-19 12:38:13 +01:00
{
int nBytes;
2013-11-22 08:56:00 +01:00
unsigned long messageSize = strlen((char*)message);
messageSize = 1600;
nBytes = send(this->socket, (char*)message , messageSize, 0);
2013-11-22 09:17:07 +01:00
if(nBytes == SOCKET_ERROR)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
2013-11-26 13:45:03 +01:00
return 0;
2013-11-19 12:38:13 +01:00
}
2013-11-22 08:56:00 +01:00
int Connection::Recieve(unsigned char message[])
2013-11-19 12:38:13 +01:00
{
int nBytes;
nBytes = recv(this->socket, (char*)message, 1600, 0);
2013-11-19 12:38:13 +01:00
if(nBytes == SOCKET_ERROR)
{
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
2013-11-19 14:21:25 +01:00
message[nBytes] = '\0';
2013-11-26 13:45:03 +01:00
return 0;
2013-11-19 12:38:13 +01:00
}
int Connection::Listen()
{
int clientSocket;
if((clientSocket = accept(this->socket, NULL, NULL)) == INVALID_SOCKET)
2013-11-19 12:38:13 +01:00
{
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
return clientSocket;
}
2013-11-25 14:03:32 +01:00
///////////////////////////////////////
//Private functions
///////////////////////////////////////
2013-11-26 13:45:03 +01:00
int Connection::initiateSocket()
2013-11-25 14:03:32 +01:00
{
this->socket = ::socket(AF_INET, SOCK_STREAM, 0);
if(this->socket == SOCKET_ERROR)
{
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-25 14:03:32 +01:00
}
2013-11-26 13:45:03 +01:00
return 0;
}