Форум программистов, компьютерный форум, киберфорум
C++: Сети
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.65/26: Рейтинг темы: голосов - 26, средняя оценка - 4.65
 Аватар для nepster
61 / 61 / 11
Регистрация: 19.09.2009
Сообщений: 844

C++ POST или GET запрос со своими заголовками

08.10.2012, 03:27. Показов 5171. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Добрый вечер.

Вопрос такой, можно ли с помощью С++ зайти к примеру на сайт site.ru и отправить свои заголовки.
Тоесть эмулировать свой браузер.

Таким образом, что бы мы к примеру открываем консоль, идет запрос на сайт site.ru со своими заголовками (рефферер, юзераген) ну как с полноценного браузера.
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
08.10.2012, 03:27
Ответы с готовыми решениями:

Отправить запрос netcat или curl с заголовками из файла
Есть файлик со всеми заголовками. Я хочу указать хост и данный файлик и чтобы мне в консоли пришёл ответ. Пытался так: cat file.txt | nc...

Как создавать окна со своими заголовками (другого цвета, меньшего размера, ...) ?
Всем привет, Кто знает, как создавать свои собственные окна в Windows? Я нашел в Интернете несколько статей о том, как делать окна...

Get или post запрос
Подскажите пожалуйста, можно ли реализовать редактирование php файла на сайте через delphi. Суть вот в чём, допустим на сайте есть php...

14
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
09.10.2012, 13:26
можно. например, открыть сокет по ip сайта и послать get запрос с заполнением нужных вам полей.
0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
11.10.2012, 15:47
Можно сделать, как сказал товарищ vxg. А можно не изобретать велосипед и воспользоваться, например, curl. Хотя - да, не панацея.
0
9 / 9 / 2
Регистрация: 13.10.2012
Сообщений: 36
19.10.2012, 14:12
Цитата Сообщение от vxg Посмотреть сообщение
можно. например, открыть сокет по ip сайта и послать get запрос с заполнением нужных вам полей.
А можно если не сложно код?
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
19.10.2012, 16:16
*приблизительно*
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
//------------------------------------------------------------------------------
#include <winsock>
#include <stdio.h>
#include <string>
#include <strstrea>
//------------------------------------------------------------------------------
int get_addr(char *host_name)
{
    int res = -1;
 
    HOSTENT *phe = gethostbyname(host_name);
    if (phe)
        for (int i = 0; i < 4; i++)
            ((BYTE *)&res)[i] = phe->h_addr_list[0][i];
 
    return res;
}
//------------------------------------------------------------------------------
int main(int argc, char* argv[])
{
    int use_host_name;
    char host_name[256];
    char host_ip[256];
    int host_port;
    char doc[256];
 
    printf("use_host_name (0 for host_ip or 1 for host_name): ");
    scanf("%i", &use_host_name);
 
    if (use_host_name)
    {
        printf("host_name: ");
        scanf("%s", host_name);
    }
    else
    {
        printf("host_ip: ");
        scanf("%s", host_ip);
    }
 
    printf("host_port: ");
    scanf("%i", &host_port);
 
    printf("doc (for example /index.htm or /): ");
    scanf("%s", doc);
 
    WSADATA wsa_data;
    if (WSAStartup(0x101, &wsa_data) || wsa_data.wVersion != 0x101) return -1;
 
    SOCKET s = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
    if (s == INVALID_SOCKET) return -1;
 
    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");
 
    std::strstream message;
    message <<
    "GET http://" << (use_host_name? host_name : host_ip) << ":" << host_port << doc << " HTTP/1.1\r\n"
    "Host: " << (use_host_name? host_name : host_ip) << ":" << host_port << "\r\n"
    "Connection: Close\r\n"
    "\r\n";
 
    if (!send(s, message.str(), message.pcount(), 0)) return -1;
 
    char buffer[100000];
    if (!recv(s, buffer, sizeof(buffer), 0)) return -1;
 
    printf(buffer);
 
    closesocket(s);
 
    WSACleanup();
 
    system("pause");
    return 0;
}
0
19.10.2012, 19:18

Не по теме:

vxg, std::strstream считается устаревшей, насколько я знаю. По-моему, из-за того, что внутри она оперирует не std::string, а прямо с C-строками (массивом char) - но точно не помню, врать не буду. Возможно, вам подойдёт std::stringstream.

0
19.10.2012, 22:37

Не по теме:

talis, выдернул, что было. интересно чем операции с цепочкой символов через std::string отличаются от операций с теми же цепочками через C-строки кроме более низкой скорости перепаковки в std::string? я бы вообще в чистый массив писал через тот же printf, но там дальше по коду шло POST с прицепом в виде файла и авторизацией на прокси-сервере и мне нужно было узнавать размер тела перед тем как писать его в сообщение - не стал выдумывать и валил все в поток. с самой реализацией потока проблемы какие-то это я знаю - см Размер потока.

0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
20.10.2012, 13:06
Цитата Сообщение от vxg Посмотреть сообщение
интересно чем операции с цепочкой символов через std::string отличаются от операций с теми же цепочками через C-строки кроме более низкой скорости перепаковки в std::string?

Не по теме:

vxg, чётким разграничением сущностей. Весь функционал работы со строками, включая хранение, переносится на класс строки, а класс потока занимается только обработкой данных. Таким образом, при использовании кода, уже однажды написанного и отлаженного, вы избегаете повторного наступления на одни и те же подводные грабли. Более того, вы могли бы полагаться на сишные строковые функции, однако, они работают только с массивом char, в то время, как std::string является частным случаем шаблона std::basic_string. То есть, однажды написанные и отлаженные алгоритмы обработки строк будут одинаковы для различных char_traits, если иного не указано в реализации std::basic_string для каких-то особых случаев. И далее: std::basic_string предоставляет итераторы, с которыми могут работать стандартные алгоритмы (с указателями-то тоже могут, но там свои плюсы, вроде перегрузки операций для каких-то особых char_traits). Ну и так далее.



Добавлено через 17 секунд

Не по теме:

No offence meant :-)

0
21.10.2012, 01:35

Не по теме:

как все это относится к потоку как к абстракции с которой человек хочет обращаться как со стандартным потоком ввода-вывода, но при этом иметь возможность считать его внутренности? практический пример чего-нибудь сверх-опасного в недрах strstream или чего-нибудь сверх-нужного в stringstream. кроме char_traits которые никто никогда не использует. или кто-то все таки использует? тогда и про них пример. без обмана - хочу расширить кругозор.

0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
21.10.2012, 12:40
Цитата Сообщение от vxg Посмотреть сообщение
как все это относится к потоку как к абстракции с которой человек хочет обращаться как со стандартным потоком ввода-вывода, но при этом иметь возможность считать его внутренности?
как к абстракции - никак. но внутренне stringstream устроен так же, как и std::fstream, или (std::cin | std::cout). стандартные потоки ввода-вывода, как и stringstream, работают с stringbuf, а strstream - с streambuf. stringbuf полагается на std::string для хранения строки, а streambuf - на себя.

пример ошибки внутри strstream - ваш (Размер потока).

к слову о deprecated и почему это плохо. цитата из Стандарта:

Annex D (normative)
Compatibility features [depr]
1 This Clause describes features of the C++ Standard that are specified for compatibility with existing implementations.
2 These are deprecated features, where deprecated is defined as: Normative for the current edition of the Standard, but not guaranteed to be part of the Standard in future revisions.

[...]

D.7 char* streams [depr.str.strstreams]
1 The header <strstream> defines three types that associate stream buffers with character array objects and assist reading and writing such objects.

[...]

D.7.4 Class strstream

[...]
То есть strstream находится в разделе Compatibility features. Почему его не стоит использовать, читайте в п. 2 части D (выше приведено)

----------------------------------------------------------------

P. S. Модераторам: возможно, имеет смысл дискуссию на тему strstream выделить в отдельный топик, т. к. это мало относится к сабжу.
0
21.10.2012, 22:41

Не по теме:

ошибкой ли было озвученное мною поведение объекта или недокументированной возможностью я так и не узнал)) к сожалению ответа на вопрос "что плохого в strstream" отличного от "потому что это не кулл" не услышал. нисколько не защищаю strstream просто рассчитывал на ликбез.

0
 Аватар для talis
794 / 546 / 61
Регистрация: 11.05.2010
Сообщений: 1,298
Записей в блоге: 1
22.10.2012, 19:35
vxg, хм, ликбез... Ну... Это не "кул" потому, что:

1) Поддержка.

Никто не обещает, что strstream будет включен в следующий стандарт C++ даже в секции "deprecated"

2) Проблема с null-терминатором.

Цитата Сообщение от http://publib.boulder.ibm.com/infocenter/comphelp/v9v111/index.jsp?topic=/com.ibm.xlcpp9.aix.doc/standlib/header_strstream.htm
strstreambuf::str

char *str();

The member function calls freeze(), then returns a pointer to the beginning of the controlled sequence. (Note that no terminating null element exists, unless you insert one explicitly.)
то есть, если вы вручную его не выставите, он не появится. по крайней мере, по докам.

3) Проблема с потенциальными утечками памяти.

Сама по себе их не делает, но их делает практически каждый её пользователь, который невнимательно читал доки.

Цитата Сообщение от http://publib.boulder.ibm.com/infocenter/comphelp/v9v111/index.jsp?topic=/com.ibm.xlcpp9.aix.doc/standlib/header_strstream.htm
strstreambuf::str

char *str();

The member function calls freeze(), then returns a pointer to the beginning of the controlled sequence. (Note that no terminating null element exists, unless you insert one explicitly.)
Когда вы вызываете str(), она сначала "замораживает" поток, а потом возвращает указатель на начало своего "внутреннего" массива char. Почему это плохо:

Цитата Сообщение от http://publib.boulder.ibm.com/infocenter/comphelp/v9v111/index.jsp?topic=/com.ibm.xlcpp9.aix.doc/standlib/header_strstream.htm
An object of class strstreambuf stores several bits of mode information as its strstreambuf mode. These bits indicate whether the controlled sequence:

- has been allocated, and hence needs to be freed eventually
- is modifiable
- is extendable by reallocating storage
- has been frozen and hence needs to be unfrozen before the object is destroyed, or freed (if allocated) by an agency other than the object
То есть, прежде, чем объект может быть уничтожен, его нужно явно разморозить вызовом freeze( false ). В противном случае, даже после покидания объектом области видимости (и, соответственно, вызовом деструктора), "внутренний" массив char, на который str() могла кому-то вернуть указатель, останется неосвобождённым (а вдруг он ещё нужен?), что приведёт к утечке памяти. Вбейте в гугле "strstream memory leak" и почитайте подробнее - на этом деле много наших полегло :-)

---

По-этому её признали deprecated, а в качестве альтернативы предложили std::stringstream, которая внутри хранит std::string, и по методу str возвращает std::string (точнее - копию внутреннего хранилища). Это приводит к тому, что, во-первых, поток не нужно замораживать/размораживать, и, во-вторых, все задачи по управлению памятью строки перекладываются на std::string, которая вполне успешно освободит свой внутренний массив char при вызове её деструктора.

Надеюсь, был полезен.
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
22.10.2012, 22:54
терминатор и утечки - это проблемы, простите за нахальство, тех людей кто не понимает что делает - в пределах описанного поведения класс ведет себя корректно. может мне не нужен терминатор. я просто хочу иметь доступ к данным буфера в котором и не текст вовсе. и я не хочу множить накладные расходы создавая копию этого буфера через создание std::string - меня вполне устраивает замороженный внутренний массив. и кстати куда они дели pcount() в новом классе? каждый раз делать копию строки и вызывать ее size()? или мучиться с seek & tellg? может просто назвали по другому...
поддержка - это реальный аргумент, тут не спорю.

Добавлено через 2 минуты
...хотя наверное при таких запросах к абстракции разумнее было бы наследовать от streambuf... но так хотелось что бы кто-то сделал это за меня...
0
18 / 18 / 3
Регистрация: 28.06.2010
Сообщений: 77
26.10.2012, 07:50
а как сформулировать ПОСТ запрос на Https через сокеты? нужно передать 2 параметра
0
Модератор
 Аватар для vxg
3406 / 2177 / 354
Регистрация: 13.01.2012
Сообщений: 8,444
26.10.2012, 10:54
это я не знаю. по идее там шифрование будет. руками делать наверное сложно. компонента какая-нибудь нужна.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
26.10.2012, 10:54
Помогаю со студенческими работами здесь

API post или get запрос
Работаю в среде Delphi. Хотелось бы узнать, как отдать команду браузеру Google Chrome, чтобы он сделал запрос. Программно не получится т.к....

POST запрос или иное решение?
Вечер добрый. Столкнулся с задачей отправки сообщений на сайте. тоесть есть сайт, на нем есть форма ... -IdHTTP как сюда...

Как выполнить GET- или POST-запрос
Как выполнить GET- или POST-запрос на wpf?

Передать ID через POST или GET запрос
Приветствую ! Вообщем делаю так. Есть &quot;карточка&quot; пациента view_patient.php, и чтобы организовать добавлении нового приёма в эту карточку...

HTTP GET запрос с заголовками
Доброго времени суток. Недавно начал пилить приложение-галерею. Использую Glide. При помощи GET запроса хочу получать JSON ответ...


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

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
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-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru