如何获得Win7应用程序与网站通信?

时间:2014-04-18 13:16:09

标签: c++

我徒劳地寻找一本名为“傻瓜网站传播”的书。有人可以建议一些好的阅读材料/教程供我咨询吗?

这就是我所处的位置:我有一个32位Windows应用程序,我使用Visual Studio 2010 C ++ Express用C ++编写。该应用程序便于用户选择文本格式的URL ==即www.maps.google.com - 然后创建一个套接字并连接它等。问题是我可以使用“发送”命令w / o错误,但我不知道在第二个参数中发送什么内容,这是一个const char []。

我已尝试过各种网站的“dump”和“refresh”等简单命令,但recv()函数在长时间延迟后只返回0(接收到的字节数)。

感谢您参与此活动。

3 个答案:

答案 0 :(得分:1)

要了解在Web服务器和客户端之间来回传输哪种数据,请查看RFC(或以tutoral开头)。

当您了解协议并使用原始套接字时,请查找C或C ++实现。 libcurl就是这样的。我还认为Windows在Windows SDK中支持HTTP客户端。

答案 1 :(得分:0)

您可能希望发送类似

的内容
GET / HTTP/1.1

获得正确的http响应。但是,大多数网站会忽略不包含某些HTTP标头(例如主机)的请求。我建议用C ++查找http客户端库,为你做一些繁琐的工作,编写自己的http请求构建代码非常重新发明。

答案 2 :(得分:0)

首先使用sendGET / HTTP/1.1..)向网络服务器发出请求,之后使用recv(Socket,buffer..)将网站HTML代码下载到缓冲区中。

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);

Winsock代码:

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