С наступающим Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы
C++: Сети
Войти
Регистрация
Восстановить пароль
 
ASCII
96 / 69 / 12
Регистрация: 15.12.2013
Сообщений: 434
Завершенные тесты: 2
1

Странные ответы HTTP сервера

12.09.2015, 23:41. Просмотров 322. Ответов 1
Метки нет (Все метки)

Всем привет. Столкнулся с проблемой, которую сам решить не могу.
В общем сразу к делу:

При получении ответа от HTTP сервера, в HTML документе, возникают непонятно откуда какие-то числа.
Вот в Linux это 2000, в windows это 5ас и подобные.
Причем происходит это только лишь в том случае, если отправлять HTTP запрос, с указанием версии 1.1.

Вот они данные:

Вот такой запрос я отправляю:
HTML5
1
2
3
GET / HTTP/1.1
Host: kramerblog.net
Connection: close
Естественно \r\n там стоят.

Вот HTML документ, который получен при таком запросе: http://rghost.ru/8vnglJCkt
Если Вы в Вашем редакторе введете: <a
То Вы на 11 совпадении заметите странный адрес, причем, место появления таких чисел, насколько я заметил произвольно, и частенько попадают в атрибут href.
При этом это точно не ошибка веб-мастеров, ибо в версии 1.0 HTTP такого не происходит.

Еще заметил, что числа эти занимают места перевода строк. То есть в текстовом редакторе, всегда слева у стенки.

Вот файл, в котором я с помощью парсера собрал все ссылки со страницы: http://rghost.ru/7jsthdY5Y
Такой вот битый адрес я выделил пробелами, Вы сразу заметите.

А вот HTML страница с запросом HTTP/1.0: http://rghost.ru/8mXncFJHf
Ссылки с нее все чистые: http://rghost.ru/6lfCfTsVt


Можете мне подсказать, в чем состоит проблема? Что я не так делаю, что не учел?
Я уже что только не перепробовал.
Например при запросе HTTP/1.1 после заголовков HTTP идет какое-то число, о котором в RFC 2616 я ни слова не нашел и после конца HTML документа, вы можете заметить 0.


Вот как я считываю с сокета данные:
C++
1
2
3
4
5
6
7
8
9
10
11
12
int readchars = 0;
char http_response[20000];
string answerOfServer;
 
// Algorithm for read TCP fragments ====================================================
while ((readchars = recv(sockfd, http_response, sizeof(http_response) - 1, 0)) > 0)
{
    // Insert to end string string http_response, readchars characters
    answerOfServer.insert(answerOfServer.size(), http_response, readchars);
}
 
// =====================================================================================
Добавлено через 35 секунд
Веб сайт выбран произвольно, на котором встретилась такая проблема.

Добавлено через 1 час 7 минут
Полный код теста:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
#include <sys/socket.h>
#include <netinet/in.h>
#include <sys/select.h>
#include <arpa/inet.h>
#include <sys/epoll.h>
#include <sys/time.h>
#include <fcntl.h>
#include <netdb.h>
#include <unistd.h>
#include <iostream>
#include <fstream>
#include <cstring>
#include "Apx/Apx.h"
#include "Apx/Url.h"
 
using namespace std;
 
int main()
{
    int sockfd = 0;
 
    if( (sockfd = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP)) == -1 )
    {
        cerr << "Cannot create a socket\n";
        exit(1);
    }
 
    sockaddr_in serv;
    serv.sin_family = AF_INET;
    serv.sin_port = htons(80);
 
    const char *server = "kramerblog.net";
    hostent *hst;
 
    if( (hst = gethostbyname(server)) )
    {
        serv.sin_addr.s_addr = ((unsigned long **)hst->h_addr_list)[0][0];
    }
    else if(!inet_aton(server, &serv.sin_addr))
    {
        cerr << "Invalid address\n";
        exit(1);
    }
 
    cout << "IPv4 address of " << server << " - " << inet_ntoa(serv.sin_addr) << endl;
 
    if( connect(sockfd, (sockaddr *)&serv, sizeof(serv)) )
    {
        cerr << "Cannot connect by server\n";
        exit(1);
    }
 
    char http_request[512];
 
    // build HTTP request
    strcpy(http_request, "GET / HTTP/1.1\r\n");
    strcat(http_request, "Host: ");
    strcat(http_request, server);
    strcat(http_request, "\r\n");
    strcat(http_request, "Connection: close\r\n\r\n");
 
    if( send(sockfd, http_request, strlen(http_request), 0) == -1 )
    {
        cerr << "Cannot send TCP segment to server\n";
        exit(1);
    }
 
    // synchronous I/O multiplexing
    fd_set rfds;
    FD_ZERO(&rfds);
    FD_SET(sockfd, &rfds);
    int nfds = sockfd + 1;
 
    timespec timeout = { 4, 0 };
    int retval = pselect(nfds, &rfds, 0, 0, &timeout, 0);
 
    if(retval == -1)
    {
        cerr << "Error of multiplexing input output\n";
        exit(1);
    }
    else if(!retval)
    {
        cerr << "Timeout\n";
        exit(1);
    }
 
    int readchars = 0;
    char http_response[20000];
    string answerOfServer;
    // Algorithm for read TCP fragments ====================================================
    while ((readchars = recv(sockfd, http_response, sizeof(http_response) - 1, 0)) > 0)
    {
        // Insert to end string string http_response, readchars characters
        answerOfServer.append(http_response, readchars);
    }
 
    // =====================================================================================
 
    cout << "Response of server was get\n";
    ofstream testResponse("testResponse.log");
    testResponse << answerOfServer;
 
    /** ############################################################################################## **/
 
    APX::TagParser parser;
    parser.parseTags(answerOfServer, "a");
    cout << "Read " << parser.size() << " tags\n";
 
    ofstream urls("urls.log");
 
    for(const auto &url : parser)
    {
        urls << url.getAttribute("href") << endl;
    }
 
    cout << "Done.\n";
 
    return 0;
}
Добавлено через 5 минут
Для сборки этого тестового кода, требуется вот эта библиотека: http://rghost.ru/6vVFrPtJk
Которой в свою очередь необходим boost_1_59. Из буста используются только boost_regex.
Поэтому и более старые версии должны подойти.
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
12.09.2015, 23:41
Ответы с готовыми решениями:

Конец ответа HTTP сервера
Подскажите как закончить ответ HTTP сервера, чтобы браузер понял где конец html...

Отсутствуют заголовки ответа http сервера
Windows 7 Почему отсутствуют заголовки ответа http сервера (200 OK)? ...

Сырые сокеты: написание промежуточного сервера, через которого подключены клиенты и сервера клиентов
Доброго времени суток! Мне нужно сделать промежуточный сервер через которого...

Странные символы в http response
Смысл такой. Делаю запрос на сайт таким методом. var net = require('net'); ...

Ответы фтп-сервера
Всем привет. Стоит xampp. Там есть FileZilla Server. Расшарил файлы\папки....

1
NoMasters
Псевдослучайный
1909 / 1120 / 90
Регистрация: 13.09.2011
Сообщений: 3,178
13.09.2015, 00:22 2
Transfer-Encoding: chunked
В RFC про это есть.
2
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.09.2015, 00:22

Странные записи в логах сервера
Привет. Помогите мне пожалуйста растолковать такую запись в логах IIS: ...

Ответы сервера на разные запросы клиента
Суть проблемы такая : Есть клиент который посылает несколько разных сообщений...

Порядок выполнения методов, криво передаются ответы клиентам сервера
:wall:Проблема вот собственно в чем: допустим игра на 3 игрока, первый игрок...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
2
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru