rendered paste body//#include "CSocketHandler.h"
void CRealmHandler::CommandClose(SOCKETINFO* sockinfo)
{
assert(sockinfo);
if (CloseSocket(sockinfo->ListID) == -1)
LOG("[-] CloseSocket failed");
else
LOG("[+] Close Succesfull");
}
unsigned int CloseSocket(unsigned int ListIndex) { return RemoveSocketFromList(ListIndex);
CSocketHandler::CSocketHandler()
{
ListCount = 0;
}
CSocketHandler::~CSocketHandler()
{
while (SocketsList.size() > 0)
{
SocketsList.pop_back();
}
}
unsigned int CSocketHandler::AddSocketToList(SOCKETINFO sinfo)
{
sinfo.ListID = ++ListCount;
SocketsList.push_back(sinfo);
return ListCount;
}
unsigned int CSocketHandler::RemoveSocketFromList(unsigned int ListIndex)
{
if (SocketsList.empty())
return -1;
for (SOCKETLIST::iterator it = SocketsList.begin(); it != SocketsList.end(); ++it)
{
if (it->ListID == ListIndex)
{
RemoveSocketFromList(it->ListID);
SocketsList.erase(it);
return --ListCount;
}
}
return -1;
}
SOCKETINFO* CSocketHandler::GetSocketInfo(unsigned int ListID)
{
if (SocketsList.empty())
return 0;
for (SOCKETLIST::iterator it = SocketsList.begin(); it != SocketsList.end(); ++it)
{
if (it->ListID == ListID)
return it->GetInstance();
}
return 0;
}
unsigned int CSocketHandler::ConnectToHost(char* Host, unsigned short Port)
{
assert(Host);
if ((Port < 1) || (Port > 65535))
return -1;
SOCKETINFO sockinfo;
sockinfo.IP = Host;
sockinfo.Port = Port;
sockinfo.HostName = Host;
sockinfo.RealIP = sockinfo.IP;
WSAData wsadata;
if (WSAStartup(MAKEWORD(2,2), &wsadata) != 0)
{
LOG("[-] WSAStartup() failed: %s (%u).", GetSocketError(), WSAGetLastError());
return CONNECT_ERROR;
}
LOG("[*] WSAStartup initialized.");
sockinfo.sock = socket(AF_INET, SOCK_STREAM, 0);
if (sockinfo.sock == INVALID_SOCKET)
{
LOG("[-] socket() failed: %s (%u).", GetSocketError(), WSAGetLastError());
WSACleanup();
return CONNECT_ERROR;
}
LOG("[*] socket created.");
hostent *remoteHost;
if (isalpha((int)Host[0])) // "ftp.google.nl"
{
remoteHost = gethostbyname(sockinfo.IP);
if (remoteHost)
{
sockinfo.RealIP = inet_ntoa(*(in_addr *)*remoteHost->h_addr_list);
sockinfo.HostName = remoteHost->h_name;
LOG("[*] Host %s is %s (%s).", sockinfo.IP, sockinfo.RealIP, sockinfo.HostName);
}
else
LOG("[-] Could not retrieve real IP of host %s.", sockinfo.HostName);
}
else // "127.0.0.1"
{
unsigned int addr = inet_addr(sockinfo.IP);
remoteHost = gethostbyaddr((char*)&addr, 4, AF_INET);
if (remoteHost)
{
sockinfo.HostName = remoteHost->h_name;
LOG("[*] Hostname of %s is %s.", sockinfo.IP, sockinfo.HostName);
}
else
LOG("[-] Could not retrieve hostname of %s.", sockinfo.IP);
}
sockinfo.sock_addr.sin_addr.s_addr = inet_addr(sockinfo.RealIP);
sockinfo.sock_addr.sin_family = AF_INET;
sockinfo.sock_addr.sin_port = htons(sockinfo.Port);
if (connect(sockinfo.sock, (sockaddr*)&sockinfo.sock_addr, sizeof(SOCKADDR_IN)) == SOCKET_ERROR)
{
LOG("[-] Connecting to %s:%d failed.", sockinfo.IP, sockinfo.Port);
LOG("[-] %s (%u).", GetSocketError(), WSAGetLastError());
WSACleanup();
return CONNECT_ERROR;
}
LOG("[*] Connected to %s:%d.\r\n", sockinfo.IP, sockinfo.Port);
return AddSocketToList(sockinfo);
}
bool CSocketHandler::HandleSocket(unsigned int SocketListID, bool AllowUserInput)
{
SOCKETINFO* socketinfo = GetSocketInfo(SocketListID);
if (!socketinfo)
{
LOG("[-] GetSocketInfo() failed (%u).", GetLastError());
return false;
}
if (AllowUserInput)
{
SocketHandlerStruct socketstruct;
socketstruct.SocketListID = socketinfo->ListID;
memcpy(&socketstruct.SocketHandler, this, sizeof(CSocketHandler));
socketinfo->hInputThread = CreateThread(0, 0, (LPTHREAD_START_ROUTINE)UserInputHandler, (void*)&socketstruct, 0, 0);
WaitForSingleObject(socketinfo->hInputThread, 2);
}
char incoming[MAX_SOCKET_RECV+1];
bool done = false;
int b_recv = 0;
while ((!done) && (socketinfo->sock)) // The big loop.
{
if (!socketinfo->sock)
break;
memset(&incoming, 0, sizeof(incoming));
b_recv = recv(socketinfo->sock, (char*)incoming, sizeof(incoming), 0);
switch (b_recv)
{
case 0:
LOG("[*] Remote host (%s) closed connection.", socketinfo->IP);
done = true;
break;
case -1:
LOG("[-] recv() error: %s (%u).", GetSocketError(), WSAGetLastError());
done = true;
break;
default:
incoming[b_recv] = '\0';
string data(incoming);
OnRead(&data, b_recv, socketinfo);
break;
}
Sleep(100);
}
//
RemoveSocketFromList(SocketListID);
//
return true;
}