Модераторы: xvr
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Отправить POST запрос, Помогите составить 
:(
    Опции темы
56kbyte
Дата 25.5.2009, 00:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



GET всё нормально, а вот с POST ответ получить не могу. Что делаю не так?



Код

#include <iostream>
#include <cstdlib>
#include <arpa/inet.h>

using namespace std;

int sendall(int s, char *buf, int len, int flags)
{
    int total = 0;
    int n;

    while(total < len)
    {
        n = send(s, buf+total, len-total, flags);
        if(n == -1) { break; }
        total += n;
    }

    return (n==-1 ? -1 : total);
}

int recvall(int s, char *buf, int len, int flags)
{
    int total = 0;
    int n;

    while(total < len)
    {
        n = recv(s, buf+total, len-total, flags);
        if(n == -1) { break; }
        total += n;
    }

    return (n==-1 ? -1 : total);
}
int main()
{
    char message[] = "POST /index.php HTTP/1.1\r\nHost: forums.dota-allstars.com \r\nUser-Agent: Opera 7.50\r\nConnection: keep-alive\r\nReferer: http://yandex.ru/ \r\n\r\n";
    
    char buf[100000];

    int my_sock;
    struct sockaddr_in addr;

    my_sock = socket ( AF_INET, SOCK_STREAM, 0 );
    if ( my_sock < 0 )
    {
        perror ( "socket" );
        exit ( 1 );
    }

    addr.sin_family = AF_INET;
    addr.sin_port = htons ( 80 ); 
    addr.sin_addr.s_addr = inet_addr( "67.227.17.102" );
    if ( connect ( my_sock, ( struct sockaddr * ) &addr, sizeof ( addr ) ) < 0 )
    {
        perror ( "connect" );
        exit ( 2 );
    }

    sendall ( my_sock, message, sizeof ( message ), 0 );

    recvall ( my_sock, buf, sizeof ( buf ), 0 );

        cout << buf << endl;
    close ( my_sock );

    return 0;
}


Это сообщение отредактировал(а) 56kbyte - 25.5.2009, 00:37
PM MAIL   Вверх
56kbyte
Дата 25.5.2009, 03:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



Короче я так понял, что нужна строка Content-Length: ****. Как в C++ склеить строки? Например на PHP получилось бы так:
Код

$var = "GET /index.php HTTP/1.1 \r\nHost: gowar.ru \r\nContent-Length: " . strlen($url) . "\r\n\r\n";

Как это на C++ организовать?  smile 
Неужели нужно делать 3 переменных и склеивать их strcat() ? 
Если так, то у меня появилась ещё 1 проблема - как склеить char и int?
Запутано всё в c++.... :(


Это сообщение отредактировал(а) 56kbyte - 25.5.2009, 03:40
PM MAIL   Вверх
Void
Дата 25.5.2009, 10:43 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


λcat.lolcat
****


Профиль
Группа: Участник Клуба
Сообщений: 2206
Регистрация: 16.11.2004
Где: Zürich

Репутация: 3
Всего: 173



Цитата(56kbyte @  25.5.2009,  05:38 Найти цитируемый пост)
Как это на C++ организовать?  smile 
Неужели нужно делать 3 переменных и склеивать их strcat() ? 

Либо s(n)printf:
Код
const char *msg_format = "POST /index.php HTTP/1.1\r\n blah-blah\r\nContent-Length: %d\r\n\r\nblahblah";
char msgbuf[4096];
int content_length = ...;
snprintf(msgbuf, sizeof(msgbuf), msg_format, content_length);

Либо, если уж это C++, использовать потоки вывода, что намного безопаснее:
Код
#include <sstream>
...
int sendall(int s, const /* ! */ char *buf, int len, int flags) { ... }
...
ostringstream msg_stream;
string msg, path, content_data;
int content_length;
...
msg_stream << "POST " << path << " HTTP/1.1\r\n"
              "Host: example.com\r\n"
              "Content-Length: " << content_length << "\r\n"
              "\r\n" <<
              content_data;
string msg = msg_stream.str();
...
sendall(my_sock, msg.c_str(), msg.size(), 0);


Это сообщение отредактировал(а) Void - 25.5.2009, 10:44


--------------------
“Coming back to where you started is not the same as never leaving.” — Terry Pratchett
PM MAIL WWW GTalk   Вверх
56kbyte
Дата 25.5.2009, 11:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 23
Регистрация: 25.5.2009

Репутация: нет
Всего: нет



Спасибо. То, что нужно smile
PM MAIL   Вверх
xlbaton
Дата 12.6.2009, 14:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 10
Регистрация: 26.9.2007

Репутация: нет
Всего: нет



а можно листинг полностью, у меня похожая задача, но что-то запутался
Спасибо!!!
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С/С++: Программирование под Unix/Linux"
xvr
  • Проставьте несколько ключевых слов темы, чтобы её можно было легче найти.
  • Не забывайте пользоваться кнопкой "Код".
  • Вопросы мобильной разработки тут
  • Телепатов на форуме нет! Задавайте чёткий, конкретный и полный вопрос. Указывайте полностью ошибки компилятора и компоновщика.
  • Новое сообщение должно иметь прямое отношение к разделу форума. Флуд, флейм, оффтопик запрещены.
  • Категорически запрещается обсуждение вареза, "кряков", взлома программ и т.д.

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, xvr.

 
 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Программирование под Unix/Linux | Следующая тема »


 




[ Время генерации скрипта: 0.0427 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.