Danbias/Code/Network/NetworkDependencies/Connection.cpp

224 lines
3.8 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>
#include <fcntl.h>
using namespace Oyster::Network;
2013-11-19 12:38:13 +01:00
2013-12-17 10:25:34 +01:00
int CloseSocket(int &socket)
{
if(socket == -1) return 0;
if(closesocket( socket ) == SOCKET_ERROR)
{
return WSAGetLastError();
}
socket = -1;
return 0;
}
Connection::Connection()
{
2013-12-13 23:47:16 +01:00
this->socket = -1;
2013-12-17 10:25:34 +01:00
this->stillSending = false;
this->closed = true;
}
Connection::Connection(int socket)
{
this->socket = socket;
2013-12-17 10:25:34 +01:00
this->stillSending = true;
this->closed = false;
}
2013-11-19 12:38:13 +01:00
Connection::~Connection()
{
2013-12-17 10:25:34 +01:00
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
}
closed = false;
stillSending = true;
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;
2013-11-27 11:28:11 +01:00
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();
2013-12-17 10:25:34 +01:00
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();
2013-12-17 10:25:34 +01:00
CloseSocket(this->socket);
2013-11-26 13:45:03 +01:00
return errorCode;
2013-11-19 12:38:13 +01:00
}
closed = false;
stillSending = true;
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-27 11:28:11 +01:00
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
{
if(this->closed) return -1;
2014-01-07 10:26:09 +01:00
int val = CloseSocket(this->socket);
this->socket = -1;
this->closed = true;
this->stillSending = false;
return val;
2013-11-19 12:38:13 +01:00
}
2013-12-16 08:59:38 +01:00
int Connection::Send(OysterByte &bytes)
2013-11-19 12:38:13 +01:00
{
if(this->closed) return -1;
2013-11-19 12:38:13 +01:00
int nBytes;
2013-12-16 08:59:38 +01:00
nBytes = send(this->socket, bytes, bytes.GetSize(), 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-12-16 08:59:38 +01:00
int Connection::Recieve(OysterByte &bytes)
2013-11-19 12:38:13 +01:00
{
if(this->closed) return -1;
2013-11-19 12:38:13 +01:00
int nBytes;
2013-12-16 08:59:38 +01:00
bytes.Resize(1000);
nBytes = recv(this->socket, bytes, 1000, 0);
2013-11-19 12:38:13 +01:00
if(nBytes == SOCKET_ERROR)
{
2013-12-16 08:59:38 +01:00
bytes.SetSize(0);
2013-11-26 13:45:03 +01:00
return WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
else
{
2013-12-16 08:59:38 +01:00
bytes.SetSize(nBytes);
}
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
}
//Listen will only return the correct socket or -1 for failure.
2013-11-19 12:38:13 +01:00
int Connection::Listen()
{
if(this->closed) return -1;
2013-11-19 12:38:13 +01:00
int clientSocket;
2013-12-10 08:32:08 +01:00
if((clientSocket = (int)accept(this->socket, NULL, NULL)) == INVALID_SOCKET)
2013-11-19 12:38:13 +01:00
{
2013-12-10 08:32:08 +01:00
return (int)INVALID_SOCKET;//WSAGetLastError();
2013-11-19 12:38:13 +01:00
}
return clientSocket;
}
2013-11-25 14:03:32 +01:00
bool Connection::IsSending()
2013-11-25 14:03:32 +01:00
{
return stillSending;
}
2013-11-25 14:03:32 +01:00
bool Connection::IsConnected()
{
return !closed;
}
int Connection::SetBlockingMode(bool blocking)
{
DWORD nonBlocking;
if(blocking)
{
nonBlocking = 0;
}
else
{
nonBlocking = 1;
}
int result = ioctlsocket(this->socket, FIONBIO, &nonBlocking);
if(result != 0)
{
return WSAGetLastError();
}
2013-12-16 08:59:38 +01:00
//Success
return 0;
}
///////////////////////////////////////
//Private functions
///////////////////////////////////////
int Connection::InitiateSocket()
{
2013-12-17 10:25:34 +01:00
if(this->socket != -1) return 0;
this->socket = (int)::socket(AF_INET, SOCK_STREAM, 0);
if(this->socket == SOCKET_ERROR)
{
return WSAGetLastError();
}
int flag = 1;
int result = setsockopt(this->socket, /* socket affected */
IPPROTO_TCP, /* set option at TCP level */
TCP_NODELAY, /* name of option */
(char *) &flag, /* the cast is historical cruft */
sizeof(int)); /* length of option value */
if (result < 0)
return -1;
return 0;
}