Форум программистов, компьютерный форум CyberForum.ru

Отправить POST запрос - C++

Восстановить пароль Регистрация
 
POST_HTTP
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 1
01.08.2015, 01:23     Отправить POST запрос #1
Помогите уже, реально задолбался, 2 дня уже ищу рабочий код который бы отправлял пост запрос но никак не могу найти. Везде какие-то либы или паки исходников которые нужно проинсталлить, но даже после инсталла вроде бы код рабочий, но при компиляции выдает кучу ошибок а-ля "ссылка на неразрешенный внешний символ и т.п."

Нашел для GET запроса - Пример POST запроса . Автор сказал что POST по аналогии. Заменил гет на пост, вроде бы идет, но большой объем не тянет (даже текстовик весом в 2 кб)

Просьба помочь в данном вопросе, у кого есть рабочий код отправки пост запроса который бы не крашился при объеме текста от 2 кб. Заранее спасибо.

Добавлено через 31 минуту
вроде бы тот код заработал (массивы подправил). теперь другая проблема - как отправить инфу с текстовика через запрос этот? отправляется только первая строчка
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 14:18     Отправить POST запрос #2
Увеличь размер массива message до нужного.
POST_HTTP_2
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 2
01.08.2015, 19:41     Отправить POST запрос #3
Цитата Сообщение от castaway Посмотреть сообщение
Увеличь размер массива message до нужного.
у меня и так все массивы по 9999, не помогает. отправляется только первая строка.
получаю данные таким образом:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
size_t count = 0;
    char S;
    ifstream f(fname);
    while (!f.eof())
    {
        f.get(S);
        count++;
    }
    f.close();
    char *S2 = new char[count];
    for (int i = 0; i < count; i++) S2[i] = NULL;
    ifstream f2(fname);
    int i = 0;
    while (!f2.eof())
    {
        f2.get(S2[i]);
        i++;
    }
    f2.close();
cout выдает нормально (весь текст), но не отправляет как надо.
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
01.08.2015, 19:43     Отправить POST запрос #4
Не вижу что у тебя там по 9999. Я говорил про этот пост.
POST_HTTP_2
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 2
01.08.2015, 19:47     Отправить POST запрос #5
дак это не мой код, я его подредактировал:

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
int sendget(char getter[9999], char datter[9999])
{
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data))
    {
        printf("WSAStartup error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    if (wsa_data.wVersion != 0x101)
    {
        printf("Bad WSA version (%i)\n", wsa_data.wVersion);
        system("pause");
        return -1;
    }
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET)
    {
        printf("socket error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    int use_host_name = 1;
    char host_name[256];
    strcpy_s(host_name, getter);
    char host_ip[256];
    int host_port = 80;
 
    char doc[9999] = "/login.php?message=";
    char aaa[9999];
 
 
    strcpy_s(aaa, doc);
    strcat_s(aaa, datter);
    SOCKADDR_IN sa;
    sa.sin_family = AF_INET;
    sa.sin_port = htons(host_port);
    sa.sin_addr.S_un.S_addr = use_host_name ? get_addr(host_name) : inet_addr(host_ip);
 
    printf("wait for server...\n");
 
    while (true)
    {
        int connect_res = connect(s, (SOCKADDR *)&sa, sizeof(sa));
        if (!connect_res) break;
 
        Sleep(250);
    }
 
    printf("connected\n");
 
    char message[9999];
 
    int message_size = sprintf_s
        (
        message,
        "POST [url]http://%s:%i%s[/url] HTTP/1.1\r\n"
        "Host: %s:%i\r\n"
        "Content-Type: application/x-www-form-urlencoded\r\n"
        "Connection: Close\r\n"
        "\r\n",
        (use_host_name ? host_name : host_ip),
        host_port,
        aaa,
        (use_host_name ? host_name : host_ip),
        host_port
        );
 
    if (send(s, message, message_size, 0) == SOCKET_ERROR)
    {
        printf("send error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
 
    char buffer[100000];
    int buffer_size = sizeof(buffer);
    buffer_size = recv(s, buffer, buffer_size, 0);
    if (buffer_size == SOCKET_ERROR)
    {
        printf("recv error (%i)\n", WSAGetLastError());
        system("pause");
        return -1;
    }
    buffer[buffer_size] = '\0';
    printf("from_server: %s\n", buffer);
 
    closesocket(s);
 
    WSACleanup();
}
чую я что ошибка в том что отправляю я пост как гет. подскажете в чем проблема?
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
01.08.2015, 22:03     Отправить POST запрос #6
Цитата Сообщение от POST_HTTP Посмотреть сообщение
Нашел для GET запроса - Пример POST запроса . Автор сказал что POST по аналогии. Заменил гет на пост, вроде бы идет, но большой объем не тянет (даже текстовик весом в 2 кб)
Нда... Нужно было удалить гланды. Нашел пример прокалывания прыща иголкой. Заменил иголку скальпелем, но почему-то теперь очень болит шея.

Используйте curl и не выпендривайтесь. С уровнем познаний "скопировал код с форума" лезть в ручное формирование multipart/form запросов и их отправку через сокеты нельзя.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
curl_global_init(CURL_GLOBAL_ALL);//один раз на всю программу
CURL *curl = curl_easy_init();
 
curl_httppost* post = 0;
curl_httppost* last = 0;
//по строчке на каждое поле запроса
curl_formadd(&post, &last, CURLFORM_COPYNAME, "user",
              CURLFORM_COPYCONTENTS, "user name", CURLFORM_END);
 
//пихаем запрос в недра curl
curl_easy_setopt(curl, CURLOPT_HTTPPOST, post);
//указываем куда его слать
curl_easy_setopt(curl, CURLOPT_URL, "http://example.com/");
//поехали!
CURLcode res = curl_easy_perform(curl);
if(res != CURLE_OK)
    cout<<"ops..."<<endl;
 
curl_formfree(post);
curl_easy_cleanup(curl);
curl_global_cleanup();
HTTP_POST
0 / 0 / 0
Регистрация: 01.08.2015
Сообщений: 6
01.08.2015, 23:09     Отправить POST запрос #7
Цитата Сообщение от POST_HTTP Посмотреть сообщение
Везде какие-то либы или паки исходников которые нужно проинсталлить, но даже после инсталла вроде бы код рабочий, но при компиляции выдает кучу ошибок а-ля "ссылка на неразрешенный внешний символ и т.п."
Держи:
Отправить POST запрос

CURL работает там где есть либа zlib или прочие. нужен чистый код что работал бы без зависимостей, поэтому пытался заюзать тот код. Давайте не будем давать советов что я и так бы нашел без вас в гугле?
P.S.: извините за мульты, просто забываю сделать сохранение майла-пасса в браузере, на это раз сохранил.
Renji
1534 / 982 / 240
Регистрация: 05.06.2014
Сообщений: 2,958
02.08.2015, 01:18     Отправить POST запрос #8
Цитата Сообщение от HTTP_POST Посмотреть сообщение
CURL работает там где есть либа zlib или прочие. нужен чистый код что работал бы без зависимостей, поэтому пытался заюзать тот код.
Такой код будет работать не везде и не всегда. Например, в Википедии принудительно включен HTTPS, который без библиотек шифрования работать не будет. Не ставится curl, берите Qt, создавайте объект QNetworkAccessManager и пинайте у него метод post. Qt то у вас, надеюсь, ставится нормально?
Цитата Сообщение от HTTP_POST Посмотреть сообщение
Давайте не будем давать советов что я и так бы нашел без вас в гугле?
Не отвечать же "а на Гугле забанили?". Гугл, "POST запрос", четвертая ссылка содержит подробное описание того, как должен выглядеть текст запроса (раздел 3.1). Раз вы пытаетесь сформировать запрос тупой заменой GET на POST, вы эту самую четвертую ссылку не открывали. Вот ответ под ваш уровень лени и был подогнан - "не выпендривайся, возьми средства попроще".
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
02.08.2015, 12:23     Отправить POST запрос
Еще ссылки по теме:

C++ Отправить байт на COM-порт
C++ Как строку отправить на принтер
Отправить запрос на сайт и получить ответ C++

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

Или воспользуйтесь поиском по форуму:
castaway
Эксперт С++
4842 / 2981 / 367
Регистрация: 10.11.2010
Сообщений: 11,013
Записей в блоге: 10
Завершенные тесты: 1
02.08.2015, 12:23     Отправить POST запрос #9
HTTP_POST, POST_HTTP_2, POST_HTTP, 5.12
Запрещено создавать несколько учетных записей (пользователей-клонов).
Yandex
Объявления
02.08.2015, 12:23     Отправить POST запрос
Ответ Создать тему
Опции темы

Текущее время: 04:04. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru