All pastes #160780 Raw Edit

Someone

public text v1 · immutable
·published 2006-09-04 18:15 UTC
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;
}