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

HTTP-POST запрос.

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

Ниже приведенный код отправляет POST запрос. Проблема в том, что в ответ принимаются не все данные(не вся страница). Подскажите пожалуйста в чем ошибка.
Код
#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
QA
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.03.2011, 01:25
Ответы с готовыми решениями:

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

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

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

Winsock отправка http post запроса
возникла необходимость в отправке post запроса, std::string get = &quot;POST &quot;; std::string...

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

12
solar_wind
766 / 756 / 59
Регистрация: 06.07.2009
Сообщений: 3,014
Завершенные тесты: 1
21.03.2011, 07:14 2
exkilla, Пакеты приходят не равномерно, а читаешь ты данные быстро. Следовательно в какой то момент времени данные ты все прочитал, а очередной пакет еще не пришел, и ты считаешь что типа все получил, а это неправильно. Тебе нужно ждать определенный таймаут и еще пытаться читать пакеты, если в течении этого таймаута пакеты не приходят, значит пришло все.
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 10:14 3
vitaly1981, ты ересь какую-то написал. Если произойдет то, что ты описал, то функция recv заблокируется, и вручную никакого таймаута делать не надо.
0
LeX
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,439
21.03.2011, 15:38 4
Цитата Сообщение от exkilla Посмотреть сообщение
ответ принимаются не все данные(не вся страница)
проблема тут
Код
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
21.03.2011, 15:38
exkilla
3 / 3 / 1
Регистрация: 28.12.2009
Сообщений: 73
21.03.2011, 16:25  [ТС] 5
Всем спасибо за ответы. Ситуация следующая. Переделал часть кода так:
Код
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
LeX
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,439
21.03.2011, 16:28 6
exkilla, убери sleep и cout и в дебаггере этот цикл прогони вручную. посмотри, все ли принимается
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 16:40 7
Цитата Сообщение от exkilla Посмотреть сообщение
while(l==128);
while(l>0);
0
LeX
Эксперт Java
378 / 370 / 114
Регистрация: 30.06.2010
Сообщений: 1,439
21.03.2011, 16:43 8
Цитата Сообщение от slice Посмотреть сообщение
while(l>0);
если l<128 то значит принято меньше информации чем размер буфера, значит информации больше на прием нет. окончание приема.
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 16:45 9
Да и вообще это условие надо сразу после recv проверять, потому что там и -1 может вернуть.

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

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

Добавлено через 21 секунду
я даже догадываюсь как ты это сделаешьответ готов
0
slice
63 / 78 / 6
Регистрация: 04.11.2010
Сообщений: 249
21.03.2011, 17:08 13
Цитата Сообщение от LeX BB Посмотреть сообщение
апровергни)))
да не, мне лениво) К тому же уже и так ясно в чем ошибка была
0
21.03.2011, 17:08
Answers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2011, 17:08

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

HTTP запрос
Написал маленькую программку http запроса, но он не подключается. Плюс к этому мне нужно получать...

HTTP запрос
Здравствуйте уважаемые программисты! Помогите новичку правильным кодом. Нужно отправить НТТР запрос...


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

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

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