Здравствуйте, у меня есть некоторые проблемы с сокетом. Я пытаюсь получить источник веб-страницы, я получаю все, что мне нужно, но между заголовком ответа и источником страницы я получаю дополнительный символ, так что мой вопрос Почему я получаю эти дополнительные символы.
Я получаю это «18ad» откуда-то …
Источник попал со страницы:
<..>
Server: Apache-Cloud
Transfer-Encoding: chunked
Date: Thu, 27 Sep 2012 14:46:43 GMT
Connection: close
X-Cache: M18ad
<!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);
18ad
является частью фрагментированный схема кодирования. Это означает, что контент загружается в несколько ломти вместо одного. 18ad
указывает размер следующего фрагмента (в данном случае 6317 байт).
Увидеть кодирование передачи по частям для описания.
Обратите внимание, что recv()
может вернуться -1
при сбое, который должен быть проверен перед использованием в качестве индекса массива.
Других решений пока нет …