#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; }
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; }