如何使用Win7应用程序与网站进行通信

How do I get a Win7 app to communicate with a website?

本文关键字:通信 网站 何使用 Win7 应用程序      更新时间:2023-10-16

我徒劳地找了一本名为《傻瓜的网站交流》的书。有人能给我推荐一些好的阅读材料/教程吗?

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

我为各种网站尝试过简单的命令,如"dump"answers"refresh",但recv()函数在长时间延迟后仅返回0(已接收字节)。

感谢您的关注。

要了解web服务器和客户端之间来回传输的数据类型,请查看RFC(或从教程开始)。

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

您可能想要发送类似的东西

GET / HTTP/1.1

以获得正确的http响应。但是,大多数站点将忽略不包括某些HTTP头(例如Host)的请求。我建议在C++中查找http客户端库,为您做一些繁重的工作,编写自己的http请求构建代码在很大程度上是在重新发明轮子。

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

send(Socket,"GET / HTTP/1.1rnHost: www.google.comrnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: www.google.comrnConnection: closernrn"),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.1rnHost: www.google.comrnConnection: closernrn", strlen("GET / HTTP/1.1rnHost: www.google.comrnConnection: closernrn"),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;
}