コード例 #1
0
ファイル: stdafx.cpp プロジェクト: MilesChan/easypush
#include "stdafx.h"
#include <Windows.h>

// TODO: reference any additional headers you need in STDAFX.H
// and not in this file
#pragma comment(lib,"ws2_32.lib")

#ifdef _DEBUG
#pragma comment(lib,"../Debug/libevent.lib")
#else
#pragma comment(lib,"../Release/libevent.lib")
#endif

boolean WSAInit();

boolean g_bWSAInited = WSAInit();

boolean WSAInit() {
	WORD  request;
	WSADATA  ws;
	request = MAKEWORD(2,2);
	int err = WSAStartup(request,&ws);
	if(err != 0) {
		return false;
	}
	if(LOBYTE(ws.wVersion) != 2||HIBYTE(ws.wVersion) != 2) {
		WSACleanup(); 
		return false;
	}
	return true;
}
コード例 #2
0
int _tmain(int argc, _TCHAR* argv[])
{
	// Get the command line options
	WCHAR *lPort, *rPort, *rAddr, *targetName = NULL;
	int i = 1;
	argv[i] ? NULL : info(argv[0]);
	bool showTargetName = false;

	if (!_wcsicmp(argv[i], L"shT"))
	{
		showTargetName = true;
		i++;
		argv[i] ? NULL : info(argv[0]);
	}

	if (!_wcsicmp(argv[i], L"setT"))
	{
		(targetName = argv[++i]) ? NULL : info(argv[0]);
		i++;
		argv[i] ? NULL : info(argv[0]);
	}

	if (!_wcsicmp(argv[i], L"lp"))
	{
		(lPort = argv[++i]) ? NULL : info(argv[0]);
		(rAddr = argv[++i]) ? NULL : info(argv[0]);
		(rPort = argv[++i]) ? NULL : info(argv[0]);
	}
	else
	{
		lPort = L"3128";
		(rAddr = argv[i++]) ? NULL : info(argv[0]);
		(rPort = argv[i++]) ? NULL : info(argv[0]);
	}

	if (WSAInit()) return -1;
	//----------------------------------------------------------------------------------------------------

	ADDRINFOT hints, *remoteAddr = NULL, *inetAddr = NULL;

	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;

	int iResult = GetAddrInfo(rAddr, rPort, &hints, &remoteAddr);
	if (iResult != 0)
	{
		switch (iResult)
		{
		case WSAHOST_NOT_FOUND: wprintf(L"Host not found\n"); break;
		case WSANO_DATA: wprintf(L"No data record found\n"); break;
		default: wprintf(L"Gethost function failed with error: %i\n", iResult);
		}

		return -1;
	}

	WCHAR hostName[NI_MAXHOST];
	iResult = GetNameInfo(remoteAddr->ai_addr, sizeof(SOCKADDR), hostName, NI_MAXHOST, NULL, 0, NI_NAMEREQD);
	if (iResult != 0)
	{
		switch (iResult)
		{
		case EAI_AGAIN:		wprintf(L"The name can not be determined at the moment\n"); break;
		case EAI_BADFLAGS:	wprintf(L"The flags parameter has an invalid value\n"); break;
		case EAI_FAIL:		wprintf(L"Name info failed\n"); break;
		case EAI_FAMILY:	wprintf(L"It does not recognize the address family\n"); break;
		case EAI_MEMORY:	wprintf(L"Not enough memory\n"); break;
		case EAI_NONAME:	wprintf(L"The name can not be determined\n"); break;
		default:			wprintf(L"Nameinfo function failed with error: %i\n", iResult);
		}

		return -1;
	}

	if (!targetName)
	{
		targetName = buildTargetName(hostName);
	}
	
	if (showTargetName)
	{
		wprintf(L"Target Name: '%s'\n", targetName);
	}

	// Create a listening socket
	SOCKET ListenSocket = newSock();
	if (ListenSocket == INVALID_SOCKET) return -1;

	// Listen address
	memset(&hints, 0, sizeof hints);
	hints.ai_family = AF_INET;
	hints.ai_socktype = SOCK_STREAM;
	hints.ai_flags = AI_PASSIVE;

	iResult = GetAddrInfo(NULL, lPort, &hints, &inetAddr);
	if (iResult != 0)
	{
		switch (iResult)
		{
		case WSAHOST_NOT_FOUND: wprintf(L"Host not found\n"); break;
		case WSANO_DATA: wprintf(L"No data record found\n"); break;
		default: wprintf(L"Gethost function failed with error: %i\n", iResult);
		}

		return -1;
	}

	//-------------------------
	// Bind the listening socket
	iResult = bind(ListenSocket, inetAddr->ai_addr, sizeof(SOCKADDR));
	if (iResult != 0)
	{
		wprintf(L"bind failed with error: %i\n", WSAGetLastError());
		return -1;
	}

	//-------------------------
	// Create a new event
	WSAEVENT NewEvent;
	if (createEv(&NewEvent)) return -1;


	//-------------------------
	// Associate event types FD_ACCEPT and FD_CLOSE
	// with the listening socket and NewEvent
	iResult = WSAEventSelect(ListenSocket, NewEvent, FD_ACCEPT);
	if (iResult != 0)
	{
		wprintf(L"WSAEventSelect failed with error: %i\n", WSAGetLastError());
		return -1;
	}

	//-------------------------
	// Start listening on the socket
	iResult = listen(ListenSocket, 0);
	if (iResult != 0)
	{
		wprintf(L"listen failed with error: %i\n", WSAGetLastError());
		return -1;
	}
	wprintf(L"NegotiateProxy listen on port %s\n", lPort);

	//-------------------------
	// Add the socket and event to the arrays, increment number of events
	SOCKET SocketArray[WSA_MAXIMUM_WAIT_EVENTS];
	WSAEVENT EventArray[WSA_MAXIMUM_WAIT_EVENTS];

	DWORD EventTotal = 0;
	SocketArray[EventTotal] = ListenSocket;
	EventArray[EventTotal++] = NewEvent;

	//bool needAuth[WSA_MAXIMUM_WAIT_EVENTS];
	//memset(needAuth, true, sizeof(needAuth));
	bool toProxy;
	DWORD secondIndex;

	DWORD index;
	SOCKET ClientSocket, ProxySocket;
	WSANETWORKEVENTS NetworkEvents;

	// The buffers for the reception - transmission
	//char prBuff[BUFF_SIZE], clBuff[BUFF_SIZE];
	int connections = 0;

	char* previousMessagesArray[WSA_MAXIMUM_WAIT_EVENTS];
	memset(previousMessagesArray, NULL, WSA_MAXIMUM_WAIT_EVENTS);
	for (int i = 0; i < WSA_MAXIMUM_WAIT_EVENTS; previousMessagesArray[i] = NULL, i++) {}
	
	while (1)
	{

		// Wait for network events on all sockets
		index = WSAWaitForMultipleEvents(EventTotal, EventArray, FALSE, WSA_INFINITE, FALSE);
		index -= WSA_WAIT_EVENT_0;

		if ((index != WSA_WAIT_FAILED) && (index != WSA_WAIT_TIMEOUT))
		{
			WSAEnumNetworkEvents(SocketArray[index], EventArray[index], &NetworkEvents);
			WSAResetEvent(EventArray[index]);

			toProxy = (index % 2) ? true : false;
			secondIndex = toProxy ? index + 1 : index - 1;

			if ((NetworkEvents.lNetworkEvents & FD_ACCEPT) && (NetworkEvents.iErrorCode[FD_ACCEPT_BIT] == 0))
			{

				ClientSocket = accept(ListenSocket, NULL, NULL);
				if (INVALID_SOCKET == ClientSocket) wprintf(L"Invalid socket\n");

				ProxySocket = socket(AF_INET, SOCK_STREAM, 0);
				if (INVALID_SOCKET == ProxySocket) wprintf(L"INVALID_SOCKET ERROR!!!\n");

				iResult = connect(ProxySocket, remoteAddr->ai_addr, sizeof(SOCKADDR));
				if (iResult != 0)
				{
					wprintf(L"Connection failed with error: %d\n", WSAGetLastError());
					return -1;
				}

				printConnections(++connections);

				if (createEv(&NewEvent)) return -1;

				SocketArray[EventTotal] = ClientSocket;
				EventArray[EventTotal] = NewEvent;

				//-------------------------
				// Associate event types FD_READ and FD_CLOSE
				// with the client socket and NewEvent
				iResult = WSAEventSelect(SocketArray[EventTotal], EventArray[EventTotal], FD_READ | FD_CLOSE);
				if (iResult != 0)
				{
					wprintf(L"WSAEventSelect failed with error: %d\n", WSAGetLastError());
					return -1;
				}

				EventTotal++;

				if (createEv(&NewEvent)) return -1;

				SocketArray[EventTotal] = ProxySocket;
				EventArray[EventTotal] = NewEvent;

				//-------------------------
				// Associate event types FD_READ and FD_CLOSE
				// with the proxy socket and NewEvent
				iResult = WSAEventSelect(SocketArray[EventTotal], EventArray[EventTotal], FD_READ | FD_CLOSE);
				if (iResult != 0)
				{
					wprintf(L"WSAEventSelect failed with error: %d\n", WSAGetLastError());
					return -1;
				}

				EventTotal++;
			}

			if ((NetworkEvents.lNetworkEvents & FD_READ) && (NetworkEvents.iErrorCode[FD_READ_BIT] == 0))
			{
				// transfers data
				iResult = transmit(
					&SocketArray[index],
					&SocketArray[secondIndex],
					toProxy,
					previousMessagesArray,
					index,
					targetName,
					hostName,
					remoteAddr->ai_addr,
					&EventArray[index]);
				if (iResult < 0) return -1;
			}

			if (NetworkEvents.lNetworkEvents & FD_CLOSE)
			{
				closesocket(SocketArray[secondIndex]);
				closesocket(SocketArray[index]);

				WSACloseEvent(EventArray[secondIndex]);
				WSACloseEvent(EventArray[index]);

				// Move from the top to the free place
				SocketArray[index] = toProxy ? SocketArray[EventTotal - 2] : SocketArray[EventTotal - 1];
				SocketArray[secondIndex] = toProxy ? SocketArray[EventTotal - 1] : SocketArray[EventTotal - 2];

				EventArray[index] = toProxy ? EventArray[EventTotal - 2] : EventArray[EventTotal - 1];
				EventArray[secondIndex] = toProxy ? EventArray[EventTotal - 1] : EventArray[EventTotal - 2];
				EventTotal -= 2;

				printConnections(--connections);
			}
		}
	}
	return 0;
}