С Новым годом! Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.78/55: Рейтинг темы: голосов - 55, средняя оценка - 4.78
3 / 3 / 1
Регистрация: 28.12.2009
Сообщений: 73

HTTP-POST запрос.

21.03.2011, 01:25. Показов 11334. Ответов 12
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ниже приведенный код отправляет POST запрос. Проблема в том, что в ответ принимаются не все данные(не вся страница). Подскажите пожалуйста в чем ошибка.
Code
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
#include <windows.h>
#include <winsock.h>
#include <string>
#include <iostream>
#include <fstream>
using namespace std;
 
#pragma comment(lib,"Wsock32.lib")
 
#define SEND_RQ(MSG) \
                /*cout<<send_str;*/ \
  send(sock,MSG,strlen(MSG),0);
 
int request (char* hostname, string& message);
 
int main()
{
        string message;
        request ("forum.dlink.ru", message);
        cout << message << endl;
        cin.get();
        return 0;
}
 
int request (char* hostname, string& message)
{
    string test;
    WSADATA WsaData;
    WSAStartup (0x0101, &WsaData);
    sockaddr_in       sin;
    int sock = socket (AF_INET, SOCK_STREAM, 0);
    if (sock == -1) 
        return -100;
 
    sin.sin_family = AF_INET;
    sin.sin_port = htons( (unsigned short)80);
 
    struct hostent * host_addr = gethostbyname(hostname);
    if(host_addr==NULL) 
        return -103;
 
    sin.sin_addr.s_addr = *((int*)*host_addr->h_addr_list ) ;
 
    if( connect (sock,(const struct sockaddr *)&sin, sizeof(sockaddr_in) ) == -1 ) 
        return -101;
 
        SEND_RQ("POST /index.php HTTP/1.1\r\n");
        SEND_RQ("Host: forum.dlink.ru\r\n");
        SEND_RQ("User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.1; ru; rv:1.9.2) Gecko/20100115 Firefox/3.6\r\n");
        SEND_RQ("Content-Type: application/x-www-form-urlencoded \r\n");
        SEND_RQ("\r\n");
 
        char c1[1];
        int l,line_length;
        bool loop = true;
        bool bHeader = false;
 
        while(loop) 
        {
                l = recv(sock, c1, 1, 0);
                if(l<0) loop = false;
                if(c1[0]=='\n') 
                {
                        if(line_length == 0) loop = false;
                        line_length = 0;
                        if(message.find("200") != string::npos)
                        bHeader = true;
                }
                else if(c1[0]!='\r') 
                         line_length++;
                message += c1[0];
        }
 
        message="";
 
        if(bHeader) 
        {
           char p[11024];
           l = recv(sock,p,11024,0);
           p[l] = '\0';
           message += p;
        }
        else 
            return -102;
 
        closesocket(sock);
        WSACleanup( );
 
        return 0;
}
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
21.03.2011, 01:25
Ответы с готовыми решениями:

[MFC]HTTP POST запрос
Здравствуйте! Есть такой алгоритм пост запроса на сервер Код: CString strHeaders = _T(&quot;Content-Type:...

HTTP запрос методом post и передача данных
Здравствуйте уважаемые программисты! Я написал программу на с++, которая отправляет http запросы методом post и данные, например...

Http post не отправляется
Здравствуйте, подскажите пожалуйста в чем проблема. Пишет, что коннектится а сам запрос не отправляется. WSADATA wsaData; struct...

12
 Аватар для solar_wind
770 / 760 / 59
Регистрация: 06.07.2009
Сообщений: 3,021
21.03.2011, 07:14
exkilla, Пакеты приходят не равномерно, а читаешь ты данные быстро. Следовательно в какой то момент времени данные ты все прочитал, а очередной пакет еще не пришел, и ты считаешь что типа все получил, а это неправильно. Тебе нужно ждать определенный таймаут и еще пытаться читать пакеты, если в течении этого таймаута пакеты не приходят, значит пришло все.
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 10:14
vitaly1981, ты ересь какую-то написал. Если произойдет то, что ты описал, то функция recv заблокируется, и вручную никакого таймаута делать не надо.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
21.03.2011, 15:38
Цитата Сообщение от exkilla Посмотреть сообщение
ответ принимаются не все данные(не вся страница)
проблема тут
Code
1
2
3
4
5
6
message="";
...
           char p[11024];
           l = recv(sock,p,11024,0);
           p[l] = '\0';
           message += p;
замени на

C++
1
2
3
4
5
6
7
8
9
10
11
message="";
char p[128];
int i=0;
do
{
l = recv(sock,p,128,0);
message += p;
i+=l;
}
while(l=128);
message[i]='\0';
писалось прямо здесь, но работать должно
0
3 / 3 / 1
Регистрация: 28.12.2009
Сообщений: 73
21.03.2011, 16:25  [ТС]
Всем спасибо за ответы. Ситуация следующая. Переделал часть кода так:
Code
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
if(bHeader) 
        {
            char p[128];
            int i=0;
            do
            {
                memset(p,'\0',sizeof(p));
                l = recv(sock,p,128,0);
                i += l;
                message += p;
                Sleep(10);
                if(l!=128)
                    cout << message << endl;
            }
            while(l==128);
        }
        else 
            return -102;
Если убрать cout в main и выводить в данном месте с Sleep, то все нормально. Вижу все данные. Если убрать Sleep - вижу только часть данных. Если использовать Sleep и вывод делать в main - также видим только часть данных. Есть идеи? =)
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
21.03.2011, 16:28
exkilla, убери sleep и cout и в дебаггере этот цикл прогони вручную. посмотри, все ли принимается
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 16:40
Цитата Сообщение от exkilla Посмотреть сообщение
while(l==128);
while(l>0);
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
21.03.2011, 16:43
Цитата Сообщение от slice Посмотреть сообщение
while(l>0);
если l<128 то значит принято меньше информации чем размер буфера, значит информации больше на прием нет. окончание приема.
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 16:45
Да и вообще это условие надо сразу после recv проверять, потому что там и -1 может вернуть.

Добавлено через 1 минуту
Цитата Сообщение от LeX BB Посмотреть сообщение
если l<128 то значит принято меньше информации чем размер буфера, значит информации больше на прием нет. окончание приема.
Почитай умные книжки, а пока не пиши больше в этой теме всякую глупость.
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
21.03.2011, 16:52
Цитата Сообщение от slice Посмотреть сообщение
Да и вообще это условие надо сразу после recv проверять, потому что там и -1 может вернуть.
да, проверка перед i+=l нужна. что бы не отминусовать.
Цитата Сообщение от slice Посмотреть сообщение
Почитай умные книжки, а пока не пиши больше в этой теме всякую глупость.
ты их видимо перечиталя так уже не раз делал, еще на ассемблере и все работало. так что
Цитата Сообщение от slice Посмотреть сообщение
не пиши больше в этой теме всякую глупость.
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 17:02
Цитата Сообщение от LeX BB Посмотреть сообщение
я так уже не раз делал, еще на ассемблере и все работало.
отличный аргумент!)))
0
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,445
21.03.2011, 17:03
Цитата Сообщение от slice Посмотреть сообщение
отличный аргумент!)))
а то)))

Добавлено через 18 секунд
апровергни)))

Добавлено через 21 секунду
я даже догадываюсь как ты это сделаешьответ готов
0
79 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 17:08
Цитата Сообщение от LeX BB Посмотреть сообщение
апровергни)))
да не, мне лениво) К тому же уже и так ясно в чем ошибка была
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
21.03.2011, 17:08
Помогаю со студенческими работами здесь

Curl http post request + кириллица
Здравствуйте, нужно написать программу для перевода текста. Использовать буду яндекс апи. С помощью curl отправляю запрос на сайт, все...

Помогите отладеть код на С++ отправка запроса post по http
вот код клиента на С++ #include &lt;windows.h&gt; #include &lt;windowsx.h&gt; #include &lt;commctrl.h&gt; #include &lt;string.h&gt; #include...

HTTP запрос и POST
Нужно сделать запрос методом POST, делаю так: var val1 = 1; var val2 = 2; var xmlHttpReq = new...

HTTP Post запрос в Qt Android
Qt 5.10.1 OS Windows 7 Разработка под Андроид Добрый день, пишу программу на Qt под Андроид. Отправляю POST запросы на сайт для...

HTTP POST запрос и параллельность
Запускаю 5 потоков одновременно и выполняю в них следующий код: WebRequest request = WebRequest.Create(requestUri); ...


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

Или воспользуйтесь поиском по форуму:
13
Ответ Создать тему
Новые блоги и статьи
Модель микоризы: классовый агентный подход
anaschu 02.01.2026
Раньше это было два гриба и бактерия. Теперь три гриба, растение. И на уровне агентов добавится между грибами или бактериями взаимодействий. До того я пробовал подход через многомерные массивы,. . .
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути
Programma_Boinc 01.01.2026
Учёным и волонтёрам проекта «Einstein@home» удалось обнаружить четыре гамма-лучевых пульсара в джете Млечного Пути Сочетание глобально распределённой вычислительной мощности и инновационных. . .
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост.
Programma_Boinc 28.12.2025
Советы по крайней бережливости. Внимание, это ОЧЕНЬ длинный пост. Налог на собак: https:/ / **********/ gallery/ V06K53e Финансовый отчет в Excel: https:/ / **********/ gallery/ bKBkQFf Пост отсюда. . .
Кто-нибудь знает, где можно бесплатно получить настольный компьютер или ноутбук? США.
Programma_Boinc 26.12.2025
Нашел на реддите интересную статью под названием Anyone know where to get a free Desktop or Laptop? Ниже её машинный перевод. После долгих разбирательств я наконец-то вернула себе. . .
Thinkpad X220 Tablet — это лучший бюджетный ноутбук для учёбы, точка.
Programma_Boinc 23.12.2025
Рецензия / Мнение/ Перевод Нашел на реддите интересную статью под названием The Thinkpad X220 Tablet is the best budget school laptop period . Ниже её машинный перевод. Thinkpad X220 Tablet —. . .
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Как объединить две одинаковые БД Access с разными данными
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru