将代码从C ++套接字转换为WinINet

时间:2015-12-08 14:47:17

标签: c++ sockets wininet

我试图使用WinInet在代码中使用套接字创建等效代码(我已经在Windows中)。

这就是我所拥有的:

#include <winsock2.h>
#include <windows.h>
#include <iostream>
#pragma comment(lib,"ws2_32.lib")
using namespace std;
int main (){
    WSADATA wsaData;
    if (WSAStartup(MAKEWORD(2,2), &wsaData) != 0) {
        cout << "WSAStartup failed.\n";
        system("pause");
        return 1;
    }
    SOCKET Socket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP);
    struct hostent *host;
    host = gethostbyname("www.google.com");
    SOCKADDR_IN SockAddr;
    SockAddr.sin_port=htons(80);
    SockAddr.sin_family=AF_INET;
    SockAddr.sin_addr.s_addr = *((unsigned long*)host->h_addr);
    cout << "Connecting...\n";
    if(connect(Socket,(SOCKADDR*)(&SockAddr),sizeof(SockAddr)) != 0){
        cout << "Could not connect";
        system("pause");
        return 1;
    }
    cout << "Connected.\n";
    send(Socket,"GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: www.google.com\r\nConnection: close\r\n\r\n"),0);
    char buffer[10000];
    int nDataLength;
    while ((nDataLength = recv(Socket,buffer,10000,0)) > 0){        
        int i = 0;
        while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
            cout << buffer[i];
            i += 1;
        }
    }
    closesocket(Socket);
        WSACleanup();
    system("pause");
    return 0;
}

这就是我用WinInet做的事情:

#include "stdafx.h"
#include <Windows.h>
#include <WinInet.h>
#pragma comment (lib, "Wininet.lib")
#pragma comment (lib, "urlmon.lib")
// Defines
#define POST 1
#define GET 0

void Request(int Method, LPCSTR Host, LPCSTR url, LPCSTR header, LPSTR data)
{
    try {
        //Retrieve default http user agent
        char httpUseragent[512];
        DWORD szhttpUserAgent = sizeof(httpUseragent);
        ObtainUserAgentString(0, httpUseragent, &szhttpUserAgent);

        char m[5];

        if (Method == GET)
            strcpy_s(m, "GET");
        else
            strcpy_s(m, "POST");

        //http://msdn.microsoft.com/en-us/library/windows/desktop/aa385096%28v=vs.85%29.aspx
        HINTERNET internet = InternetOpenA(httpUseragent, INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
        if (internet != NULL)
        {
            //http://msdn.microsoft.com/en-us/library/windows/desktop/aa384363%28v=vs.85%29.aspx
            HINTERNET connect = InternetConnectA(internet, Host, INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 0);
            if (connect != NULL)
            {
                //http://msdn.microsoft.com/en-us/library/windows/desktop/aa384233%28v=vs.85%29.aspx
                HINTERNET request = HttpOpenRequestA(connect, m, url, "HTTP/1.1", NULL, NULL,
                    INTERNET_FLAG_HYPERLINK | INTERNET_FLAG_IGNORE_CERT_CN_INVALID |
                    INTERNET_FLAG_IGNORE_CERT_DATE_INVALID |
                    INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTP |
                    INTERNET_FLAG_IGNORE_REDIRECT_TO_HTTPS |
                    INTERNET_FLAG_NO_AUTH |
                    INTERNET_FLAG_NO_CACHE_WRITE |
                    INTERNET_FLAG_NO_UI |
                    INTERNET_FLAG_PRAGMA_NOCACHE |
                    INTERNET_FLAG_RELOAD, NULL);

                if (request != NULL)
                {
                    int datalen = 0;
                    if (data != NULL) datalen = strlen(data);
                    int headerlen = 0;
                    if (header != NULL) headerlen = strlen(header);

                    //http://msdn.microsoft.com/en-us/library/windows/desktop/aa384247%28v=vs.85%29.aspx
                    HttpSendRequestA(request, header, headerlen, data, datalen);

                    //http://msdn.microsoft.com/en-us/library/windows/desktop/aa384350%28v=vs.85%29.aspx
                    InternetCloseHandle(request);
                }
            }
            InternetCloseHandle(connect);
        }
        InternetCloseHandle(internet);
    }
    catch (...) {}
}

int main()
{
    char URL[1024];
    char* geturi = ""; // string.empty ( I want to make the request to the main page )
    wsprintfA(URL, geturi, NULL, NULL);
    Request(GET, "google.com", URL, NULL, NULL);
    // How can I see if it works? I want to get the webpage html source
    getchar(); // I avoided system("pause") function as it isn't portable.
}

我怎样才能看出它是否有效?

提前致谢,

的Qasim

0 个答案:

没有答案