Advertisement
Guest User

WinSocks2

a guest
Jan 18th, 2012
81
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.94 KB | None | 0 0
  1. #ifndef WIN32_LEAN_AND_MEAN
  2. #define WIN32_LEAN_AND_MEAN
  3. #endif
  4.  
  5. #include "stdafx.h"
  6. #include "WSockHttp.h"
  7. #include "ConsoleRedir.h"
  8. #include <winsock2.h>
  9. #include <ws2tcpip.h>
  10. #include <stdio.h>
  11.  
  12. #pragma comment(lib, "Ws2_32.lib")
  13.  
  14. #define _DEBUG
  15.  
  16. int APIENTRY _tWinMain(HINSTANCE hInstance,
  17.                      HINSTANCE hPrevInstance,
  18.                      LPTSTR    lpCmdLine,
  19.                      int       nCmdShow)
  20. {
  21.     RedirectIOToConsole();
  22.  
  23.  
  24.     //Init WinSocks
  25.     WSADATA wsaData;
  26.     if(int iRet = WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
  27.     {
  28.         _tprintf(TEXT("Error '%d' starting Winsocks: %d\n"), iRet, WSAGetLastError());
  29.         return iRet;
  30.     }
  31.  
  32.     //Get IP address info of given host
  33.     struct addrinfoW    servAddr,
  34.                         *pServAddr,
  35.                         *pServRes;
  36.  
  37.     ZeroMemory(&servAddr, sizeof(servAddr));
  38.  
  39.     servAddr.ai_family = AF_INET;
  40.     servAddr.ai_socktype =  SOCK_STREAM;
  41.     servAddr.ai_protocol = IPPROTO_TCP;
  42.  
  43.     const TCHAR cpServer[] = TEXT("www.google.com");
  44.  
  45.     //Resolve hostname to IP
  46.     if(int iRet = GetAddrInfo(cpServer, TEXT("80"), &servAddr, &pServRes))
  47.     {
  48.         _tprintf(TEXT("Error getting server information: %d\n"), iRet);
  49.         WSACleanup();
  50.     }
  51.  
  52.     //Check if we can connect to the server
  53.     SOCKET servSocket = INVALID_SOCKET;
  54.  
  55.     //Loop through each address in the linked list, until we get a connectable socket
  56.     pServAddr = pServRes;
  57.  
  58.     while(1)
  59.     {
  60.         //Attempt to create a socket and connect
  61.         servSocket = socket(pServAddr->ai_family, pServAddr->ai_socktype, pServAddr->ai_protocol);
  62.         int iRes = connect(servSocket, pServAddr->ai_addr, (int)pServAddr->ai_addrlen);
  63.  
  64.         //Check we have a valid socket and more servers
  65.         if(iRes == SOCKET_ERROR)
  66.         {
  67.             //Close socket
  68.             closesocket(servSocket);
  69.             servSocket = INVALID_SOCKET;
  70.  
  71.             //Go to next address, if there is one
  72.             if(pServAddr->ai_next != NULL)
  73.             {
  74.                 //Go to next server
  75.                 pServAddr = pServAddr->ai_next;
  76.             }
  77.             else
  78.             {
  79.                 //We've ran out of servers, return with error
  80.                 _tprintf(TEXT("Error establishing connection to server: %d\n"), WSAGetLastError());
  81.                 FreeAddrInfo(pServRes);
  82.                 WSACleanup();
  83.                 return 2;
  84.             }
  85.         }
  86.         else
  87.         {
  88.             //We have an invalid socket, continue
  89.             FreeAddrInfo(pServRes);
  90.             break;
  91.         }
  92.     }
  93.  
  94.     //Send HTTP header to server
  95. #define MAX_HEADER_LEN 512
  96.    
  97. #ifdef UNICODE
  98.  
  99.     char* cpHost = (char*)malloc(sizeof(char) * (_tcslen(cpServer)+1));
  100.     wcstombs(cpHost, cpServer, _tcslen(cpServer));
  101.     cpHost[_tcslen(cpServer)] = '\0';
  102.  
  103. #else
  104.     char* cpHost = cpServer;
  105. #endif
  106.  
  107.     char cpHeader[MAX_HEADER_LEN];
  108.     sprintf(cpHeader, "GET %s HTTP/1.1\r\nHost: %s\r\n\r\n", "/", cpHost);
  109.  
  110. #ifdef UNICODE
  111.     free(cpHost);
  112. #endif
  113.  
  114.     //Send the HTTP request to the sever
  115.     int iSent;
  116.     if(iSent = send(servSocket, cpHeader, strlen(cpHeader), 0) == SOCKET_ERROR)
  117.     {
  118.         _tprintf(TEXT("Error sending header to server: %d\n"), WSAGetLastError());
  119.         WSACleanup();
  120.         return 2;
  121.     }
  122.  
  123.     _tprintf(TEXT("Sent '%d' bytes\n"), iSent);
  124.  
  125.     return 0;
  126. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement