从带有套接字的页面加载数据

时间:2015-02-13 21:08:03

标签: c++ sockets visual-studio-2013

我选择不使用libcurl,因为我已经花了太多精力试图让它运行。

所以我是c ++的新手,并不完全了解所有内容。

我无法从example.com/test.php获取内容,但使用test.example.com确实有效(虽然不得不为它创建一个子域)

除此之外,有没有办法只获取内容而不是响应标题?

我的代码:

string result;
WSADATA wsaData;
if (WSAStartup(MAKEWORD(2, 2), &wsaData) != 0) {
    cout << "WSAStartup failed.\n";
    system("pause");

}
SOCKET Socket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
struct hostent *host;
host = gethostbyname("www.example.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");
}
cout << "Connected.\n";
send(Socket, "GET / HTTP/1.1\r\nHost: test.example.nl\r\nConnection: close\r\n\r\n", strlen("GET / HTTP/1.1\r\nHost: test.example.nl\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') {
        result += buffer[i];
        i += 1;
    }
}
cout << result;
closesocket(Socket);
WSACleanup();

所以我发现前160个字符与标题相关。 为了过滤掉标题我做了这个:

while (buffer[i] >= 32 || buffer[i] == '\n' || buffer[i] == '\r') {
       if(i > 160) {
            result += buffer[i];
            i += 1;
        }
    }

但是如果标题不一样怎么办?例如,它使用不同的服务器或其他东西。或者改变了php版本。

标题我作为回应(如果这对某人有意义的话)

HTTP/1.1 200 OK
Date: Fri, 13 Feb 2015 20:39:56 GMT
Server: Apache
X-Powered-By: PHP/5.3.29
Content-Length: 4
Connection: close
Content-Type: text/html

1 个答案:

答案 0 :(得分:1)

每次发出请求时,标题都会发生变化。你不能假设它是一个固定的字节数。你必须解析标题。你需要的是:

https://www.ietf.org/rfc/rfc2616.txt

如果查看第39页,您会看到HTTP标题以空行结束,因此请查找空行,然后内容低于该行。当然,如果这不仅仅是一个学术练习,你可能想找到一个为你做这个的图书馆。 HTTP非常复杂。

6回复

在接收并解释请求消息后,服务器响应    带有HTTP响应消息。

以下是该规范的摘录。你想要&#34; message-body&#34;

   Response      = Status-Line               ; Section 6.1
                   *(( general-header        ; Section 4.5
                    | response-header        ; Section 6.2
                    | entity-header ) CRLF)  ; Section 7.1
                   CRLF
                   [ message-body ]          ; Section 7.2