#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include "stdafx.h"
#include "WSockHttp.h"
#include "ConsoleRedir.h"
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#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;
}