#include "Globals.h" // NOTE: MSVC stupidness requires this to be the same across all modules #include "cSocket.h" #ifndef _WIN32 #include #include // #include // #include #include //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); }