summaryrefslogblamecommitdiffstats
path: root/source/cSocket.cpp
blob: 427441145080010f9f39d5927fa1bcaee0c61030 (plain) (tree)
1
2
3
4
5
6
7
8
9
10
11
12
                     
                       
 
               
                   
                    





                                              

       

                                     
                          

























                                                 




                               



                                                                            
       
































































































                                                                                    
 
#include "cSocket.h"
#include "cMCLogger.h"

#ifndef _WIN32
#include <netdb.h>
#include <unistd.h>
#include <errno.h>
//#include <sys/socket.h>
//#include <netinet/in.h>
#include <arpa/inet.h>		//inet_ntoa()
#else
#define socklen_t int
#endif

cSocket::cSocket( xSocket a_Socket )
	: m_Socket( a_Socket )
	, m_IPString( 0 )
{
}

cSocket::~cSocket()
{
}

cSocket::operator const cSocket::xSocket() const
{
	return m_Socket;
}

cSocket::xSocket cSocket::GetSocket() const
{
	return m_Socket;
}

bool cSocket::IsValid()
{
#ifdef _WIN32
	return ( m_Socket != INVALID_SOCKET);
#else
	return ( m_Socket >= 0);
#endif
}

void cSocket::CloseSocket()
{
#ifdef _WIN32
	closesocket(m_Socket);
#else
	if( shutdown(m_Socket, SHUT_RDWR) != 0 )//SD_BOTH);
		LOGWARN("Error on shutting down socket (%s)", m_IPString );
	if( close(m_Socket) != 0 )
		LOGWARN("Error closing socket (%s)", m_IPString );
#endif
}

const char* cSocket::GetLastErrorString()
{
#define CASE_AND_RETURN( x ) case x: return #x

#ifdef _WIN32
	switch( WSAGetLastError() )
	{
		CASE_AND_RETURN( WSANOTINITIALISED );
		CASE_AND_RETURN( WSAENETDOWN );
		CASE_AND_RETURN( WSAEFAULT );
		CASE_AND_RETURN( WSAENOTCONN );
		CASE_AND_RETURN( WSAEINTR );
		CASE_AND_RETURN( WSAEINPROGRESS );
		CASE_AND_RETURN( WSAENETRESET );
		CASE_AND_RETURN( WSAENOTSOCK );
		CASE_AND_RETURN( WSAEOPNOTSUPP );
		CASE_AND_RETURN( WSAESHUTDOWN );
		CASE_AND_RETURN( WSAEWOULDBLOCK );
		CASE_AND_RETURN( WSAEMSGSIZE );
		CASE_AND_RETURN( WSAEINVAL );
		CASE_AND_RETURN( WSAECONNABORTED );
		CASE_AND_RETURN( WSAETIMEDOUT );
		CASE_AND_RETURN( WSAECONNRESET );
	}
	return "No Error";
#else
	return "GetLastErrorString() only works on Windows";
#endif
}

int cSocket::SetReuseAddress()
{
#ifdef _WIN32
	char yes = 1;
#else
	int yes = 1;
#endif
	return setsockopt( m_Socket, SOL_SOCKET, SO_REUSEADDR, &yes, sizeof(int) );
}

int cSocket::WSAStartup()
{
#ifdef _WIN32
	WSADATA wsaData;
	memset( &wsaData, 0, sizeof( wsaData ) );
	return ::WSAStartup( MAKEWORD(2, 2),&wsaData);
#else
	return 0;
#endif
}

cSocket cSocket::CreateSocket()
{
	return socket(AF_INET,SOCK_STREAM,0);
}

int cSocket::Bind( SockAddr_In& a_Address )
{
	sockaddr_in local;

	if( a_Address.Family == ADDRESS_FAMILY_INTERNET )
		local.sin_family = AF_INET;

	if( a_Address.Address == INTERNET_ADDRESS_ANY )
		local.sin_addr.s_addr = INADDR_ANY;

	local.sin_port=htons( (u_short)a_Address.Port );

	return bind( m_Socket, (sockaddr*)&local, sizeof(local));
}

int cSocket::Listen( int a_Backlog )
{
	return listen( m_Socket, a_Backlog );
}

cSocket cSocket::Accept()
{
	sockaddr_in from;
	socklen_t fromlen=sizeof(from);

	cSocket SClient = accept( m_Socket, (sockaddr*)&from, &fromlen);

	if( from.sin_addr.s_addr && SClient.IsValid() )	// Get IP in string form
	{
		SClient.m_IPString = inet_ntoa(from.sin_addr);
		//LOG("cSocket::Accept() %s", SClient.m_IPString );
	}

	return SClient;
}

int cSocket::Receive( char* a_Buffer, unsigned int a_Length, unsigned int a_Flags )
{
	return recv(m_Socket, a_Buffer, a_Length, a_Flags);
}