Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Программирование под Unix/Linux > Отправить POST запрос


Автор: 56kbyte 25.5.2009, 00:36
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, 03:38
Короче я так понял, что нужна строка 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++.... :(

Автор: Void 25.5.2009, 10:43
Цитата(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);

Автор: 56kbyte 25.5.2009, 11:01
Спасибо. То, что нужно smile

Автор: xlbaton 12.6.2009, 14:37
а можно листинг полностью, у меня похожая задача, но что-то запутался
Спасибо!!!

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)