#ifndef WIN32_LEAN_AND_MEAN #define WIN32_LEAN_AND_MEAN #endif #include "stdafx.h" #include "WSockHttp.h" #include "ConsoleRedir.h" #include #include #include #pragma comment(lib, "Ws2_32.lib") #define _DEBUG int APIENTRY _tWinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPTSTR lpCmdLine, int nCmdShow) { RedirectIOToConsole(); //Init WinSocks WSADATA wsaData; if(int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) { _tprintf(TEXT("Error '%d' starting Winsocks: %d\n"), iRet, WSAGetLastError()); return iRet; } //Get IP address info of given host struct addrinfoW servAddr, *pServAddr, *pServRes; ZeroMemory(&servAddr, sizeof(servAddr)); servAddr.ai_family = AF_INET; servAddr.ai_socktype = SOCK_STREAM; servAddr.ai_protocol = IPPROTO_TCP; const TCHAR cpServer[] = TEXT("www.google.com"); //Resolve hostname to IP if(int iRet = GetAddrInfo(cpServer, TEXT("80"), &servAddr, &pServRes)) { _tprintf(TEXT("Error getting server information: %d\n"), iRet); WSACleanup(); } //Check if we can connect to the server SOCKET servSocket = INVALID_SOCKET; //Loop through each address in the linked list, until we get a connectable socket pServAddr = pServRes; while(1) { //Attempt to create a socket and connect servSocket = socket(pServAddr->ai_family, pServAddr->ai_socktype, pServAddr->ai_protocol); int iRes = connect(servSocket, pServAddr->ai_addr, (int)pServAddr->ai_addrlen); //Check we have a valid socket and more servers if(iRes == SOCKET_ERROR) { //Close socket closesocket(servSocket); servSocket = INVALID_SOCKET; //Go to next address, if there is one if(pServAddr->ai_next != NULL) { //Go to next server pServAddr = pServAddr->ai_next; } else { //We've ran out of servers, return with error _tprintf(TEXT("Error establishing connection to server: %d\n"), WSAGetLastError()); FreeAddrInfo(pServRes); WSACleanup(); return 2; } } else { //We have an invalid socket, continue FreeAddrInfo(pServRes); break; } } //Send HTTP header to server #define MAX_HEADER_LEN 512 #ifdef UNICODE char* cpHost = (char*)malloc(sizeof(char) * (_tcslen(cpServer)+1)); wcstombs(cpHost, cpServer, _tcslen(cpServer)); cpHost[_tcslen(cpServer)] = '\0'; #else char* cpHost = cpServer; #endif char cpHeader[MAX_HEADER_LEN]; sprintf(cpHeader, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", "/", cpHost); #ifdef UNICODE free(cpHost); #endif //Send the HTTP request to the sever int iSent; if(iSent = send(servSocket, cpHeader, strlen(cpHeader), 0) == SOCKET_ERROR) { _tprintf(TEXT("Error sending header to server: %d\n"), WSAGetLastError()); WSACleanup(); return 2; } _tprintf(TEXT("Sent '%d' bytes\n"), iSent); return 0; }