获取网站来源,获取额外的符号,winsock

时间:2012-09-27 14:59:45

标签: c++ sockets winsock

你好我有socket的问题。我正在尝试获取网页来源,我得到了我需要的所有东西,但在响应标题和页面源之间我得到了一些额外的符号,所以我的问题是为什么我得到那些额外的符号。

我从某个地方得到了“18ad”......

来自页面的来源:

<..>
Server: Apache-Cloud
Transfer-Encoding: chunked
Date: Thu, 27 Sep 2012 14:46:43 GMT
Connection: close
X-Cache: M


18ad

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
    "http://www.w3.org/TR/xh
<..>

十六进制视图:

    char: X-Cache: M......18ad...<!DO
    hex : 58 2D 43 61 63 68 65 3A 20 4D 0D 0D 0A 0D 0D 0A 31 38 61 64 0D 0D 0A 3C 21 44 4F

请求标题:

$GET / HTTP/1.1\r\n
Host: www.demotivation.us\r\n
Connection: close\r\n\r\n

我的代码:

char*       ip  = "www.demotivation.us";
char*       url = "92.61.41.215";

<..>
sockAddr.sin_family = AF_INET;
sockAddr.sin_addr.s_addr = inet_addr(ip);
sockAddr.sin_port = htons(80);
<..>
s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
connect(s, (SOCKADDR*)&sockAddr, sizeof(SOCKADDR_IN);

<..>

// receive source to temporary buffer
do
{
    bytes = recv(s, buffer, BUFFER_SIZE, 0);
    buffer[bytes] = '\0';

    cout << buffer;
} while(bytes > 0);

1 个答案:

答案 0 :(得分:1)

18ad chunked 编码方案的一部分。这意味着内容将以多个而不是一个下载。 18ad表示下一个块的大小(在这种情况下为6317字节)。

有关说明,请参阅chunked transfer encoding

请注意recv()可以在失败时返回-1,在用作数组索引之前应检查该错误。