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


Автор: csander 10.11.2008, 08:31
Подскажите пожалуйста, как реализовать вот такую задачу?
Нужно по нажатию кнопки отправить http запрос, например такого вида: "http://localhost/test.php?a=1&b=2". 

Автор: MAKCim 10.11.2008, 09:09
csander, 
ну создаешь TCP сокет
коннектишься к 80-му порту localhost-а
оформляешь HTTP заголовок с нужным запросом (GET, POST)
отправляешь данные

Автор: csander 10.11.2008, 09:17
можешь пример кода дать? или ссылку?

Автор: MoLeX 10.11.2008, 09:25
csander, вот пример скачки файла с веб сервера открытого на 80 порту
Код

        TFileStream *file_str = new TFileStream("123.mp3", fmCreate);
        Edit1 -> Text = size_t(file_str);
        IdHTTP -> Get("http://192.168.191.46:80/123.mp3", file_str);
        delete file_str;


если тебе нужно чтобы результат сохранился то почти не чего менять не надо кроме адресса

Автор: csander 10.11.2008, 09:43
какую библиотеку надо подключить? ))

Автор: MoLeX 10.11.2008, 09:51
csander, извени забыл сказать... загружать билдер лень, в виде исходника выложил

Автор: csander 10.11.2008, 10:00
http://ipicture.ru/

че это такое? выходит при компиляции

Автор: MoLeX 10.11.2008, 10:02
эмн... не знаю(((

Добавлено через 36 секунд
у тебя какая среда? у меня просто Builder 6 может из-за него

Добавлено через 1 минуту и 45 секунд
Цитата(csander @  10.11.2008,  09:43 Найти цитируемый пост)
какую библиотеку надо подключить? )) 

компонент IdHttp c вкладки IndyClients

Автор: smoke_man 10.11.2008, 11:12
Вот пример работы через сокеты по протоколу HTTP
Код

#include <winsock2.h>
#include <iostream>
#include <string>



int main()
{  
    //Пакет запроса по HTTP протоколу
    std::string  packet;
    //Структура для настройки сокета
    sockaddr_in SA;
    SOCKET Sock;
    // поехали
    //1)  заполняем протокол запроса
    packet="GET /test.php?a=1&b=2 HTTP/1.1 \r\n\
           Accept: text/html, */* \r\n\
           Accept-Language: ru \r\n\
           Accept-Encoding: identity \r\n\
           User-Agent: Mozilla/3.0 (compatible; Indy Library) \r\n\
           Host: 127.0.0.1 \r\n\
           Connection: Keep-Alive \r\n\r\n" ;
    //настраиваем сокет
    SA.sin_family=AF_INET;
    SA.sin_port=htons(80);
    SA.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");
    //2) собственно сами действия
    WSAData WSData;
    WSAStartup(MAKEWORD(2,0), &WSData);
    //Создаем сокет и проверяем на ошибку
    Sock = socket(AF_INET,SOCK_STREAM,0);
    if (Sock==0) 
    {
        std::cout<<"Error socket"<<std::endl;
        return -1;
    }
    //Конектимся к серверу
    if (connect(Sock,(sockaddr*)&SA,sizeof(SA))==-1) 
    {
        std::cout<<"Error connect"<<std::endl;
        return -1;
    }

    //Шлем пакет    
    send(Sock,packet.c_str(),int(packet.length()),0);

    //Закрываем соект
    closesocket(Sock);
    WSACleanup();
}


Автор: xvr 10.11.2008, 12:05
Цитата(csander @ 10.11.2008,  08:31)
Подскажите пожалуйста, как реализовать вот такую задачу?
Нужно по нажатию кнопки отправить http запрос, например такого вида: "http://localhost/test.php?a=1&b=2".

Тебе нужны шашечки или ехать? Если второе - то возьми готовые компоненты:
  •  Под BCB уже упоминавшийся тут Indy (хотя он и не без глюков)
  •  Под VC можно заюзать wininet.dll (за ним - в http://msdn.microsoft.com/en-us/library/aa385331(VS.85).aspx)

Автор: DRUG_ADDICT 30.11.2008, 03:19
smoke_man, компилирую... вылазит это:

Код

\123.o:123.cpp:(.text+0x1ac)||undefined reference to `_htons@4'|
\123.o:123.cpp:(.text+0x1bf)||undefined reference to `_inet_addr@4'|
\123.o:123.cpp:(.text+0x1db)||undefined reference to `_WSAStartup@8'|
\123.o:123.cpp:(.text+0x1fa)||undefined reference to `_socket@12'|
\123.o:123.cpp:(.text+0x272)||undefined reference to `_connect@12'|
\123.o:123.cpp:(.text+0x309)||undefined reference to `_send@16'|
\123.o:123.cpp:(.text+0x317)||undefined reference to `_closesocket@4'|
\123.o:123.cpp:(.text+0x31f)||undefined reference to `_WSACleanup@0'|
||=== Build finished: 8 errors, 0 warnings ===|

помогите плиз... че не так? гугл молчит <censored>.

Автор: J0ker 30.11.2008, 07:36
Цитата(DRUG_ADDICT @ 30.11.2008,  03:19)
smoke_man, компилирую... вылазит это:

Код

\123.o:123.cpp:(.text+0x1ac)||undefined reference to `_htons@4'|
\123.o:123.cpp:(.text+0x1bf)||undefined reference to `_inet_addr@4'|
\123.o:123.cpp:(.text+0x1db)||undefined reference to `_WSAStartup@8'|
\123.o:123.cpp:(.text+0x1fa)||undefined reference to `_socket@12'|
\123.o:123.cpp:(.text+0x272)||undefined reference to `_connect@12'|
\123.o:123.cpp:(.text+0x309)||undefined reference to `_send@16'|
\123.o:123.cpp:(.text+0x317)||undefined reference to `_closesocket@4'|
\123.o:123.cpp:(.text+0x31f)||undefined reference to `_WSACleanup@0'|
||=== Build finished: 8 errors, 0 warnings ===|

помогите плиз... че не так? гугл молчит <censored>...

я вот не понимаю, неужели так трудно посмотреть хелп??? ведь гораздо быстрее чем лезть на форум

Код

Library    Use Ws2_32.lib.
 


Цитата(DRUG_ADDICT @  30.11.2008,  03:19 Найти цитируемый пост)
гугл молчит <censored>.... 

да неужели

Автор: DRUG_ADDICT 1.12.2008, 00:12
хорошо спасибо... 

а теперь что??? 

Код

[Linker Error] Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '_main' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0X32.OBJ

извините меня конечно но в С++ когда нибудь что нибудь нормально компилируется или вот так всегда? только не надо меня винить пжлст, я вот увидел здесь на форуме эти исподники захотел их скомпилировать... и вот надо же прикол =)

Компилировал через Dev-C++ затем через Code::Blocks вот вчера скачал Borland C++ Builder 6 теперь такая ошибка... 


J0ker, а что ты там пишешь про хелпы свои? знаешь... если бы я знал где твои хелпы мне искать и как сними работать... поверь я бы сюда даже не заходил.

Добавлено через 3 минуты и 6 секунд
Решение:
Цитата

Вопрос ===============================================
16. При компиляции проекта я получаю сообщение линковщика "Unresolved external" с именем функции и указанием модуля. Как решить проблему?
Ответ ================================================
Данная ошибка говорит о том, что линковщик нашел объявление функции и функция используется в программе, но отсутствует модуль в котором эта функция реализована. Что бы устранить ошибку необходимо:
1. Ознакомиться в MSDN(http://msdn.microsoft.com) или в разделе справки билдера Windows SDK (Help\Windows SDK) с описанием функции. В конце описания как правило указывается из какого .lib файла данная функция экспортируется.
2. Зайти в папку $(BCB)\lib\psdk и найти необходимый файл.
3. Если файл найден - через Project\Add to project (или Shift+F11) добавить его в проект. Запустить компиляцию, ошибка исчезнет. Иначе следующий шаг.
4. Найдите .dll с таким же названием в системной папке.
5. Скопируйте в папку проекта.
6. Выполните утилиту $(BCB)\Bin\coff2omf c параметрами командной строки вида coff2omf dllname.dll dllnamebcb.dll
7. С получившимся файлом используйте утилиту $(BCB)\Bin\implib.exe, т.е.
implib dllnamebcb.dll dllnamebcb.lib
8. Полученую библиотеку прилинкуйте к проекту как в шаге третьем.
Кстати, я предпочитаю создавать либы а не использовать борландовские.

нет, если действительно в С++ так всегда, хых, в топку его =))) 

Автор: DRUG_ADDICT 1.12.2008, 01:27
 smile  smile  smile<censored>. захожу на http://msdn.microsoft.com/ru-ru/visualc/aa336457.aspx в поиск в биваю InitVCL или ExitVCL не че не находит smile захожу в C++ Builder 6 там Help => Windows SDK в поиске набираю InitVCL или ExitVCL  smile  smile  smile 

Автор: J0ker 1.12.2008, 03:51
Цитата(DRUG_ADDICT @  1.12.2008,  00:12 Найти цитируемый пост)
извините меня конечно но в С++ когда нибудь что нибудь нормально компилируется или вот так всегда?

зависит от компилящего  smile 
тем более у тебя проблема не в компиляции, а в линковке - скорее всего эта неточность происходит из банального незнания, которое нужно ликвидировать

Цитата(DRUG_ADDICT @  1.12.2008,  00:12 Найти цитируемый пост)
если бы я знал где твои хелпы мне искать и как сними работать...

мои??? это шутко такой, да?

Цитата(DRUG_ADDICT @  1.12.2008,  00:12 Найти цитируемый пост)
нет, если действительно в С++ так всегда, хых, в топку его =))) 

в топку тех, кто не знает разницы между компилятором, линкером и средой разработки

Цитата(DRUG_ADDICT @  1.12.2008,  01:27 Найти цитируемый пост)
ахожу в C++ Builder 6 там Help => Windows SDK в поиске набираю InitVCL или ExitVCL

http://en.wikipedia.org/wiki/Visual_Component_Library
VCL никакого отношения к winSDK не имеет - это борландовская библиотека - там и смотри какие либы надо подключить - я с борландом не работаю

ЗЫЖ всех бы вас взять за одно место и на vi и gcc посадить, и пока основ не выучите - на винду не пущать  smile 

Автор: Олег2005 1.12.2008, 11:22
DRUG_ADDICT, 
M
Олег2005
Предупреждение за завуалированный мат в тематическом топике. Будьте вежливы с теми, кто тратит свое личное время на помощь вам

Автор: xvr 1.12.2008, 11:48
Цитата(DRUG_ADDICT @ 1.12.2008,  00:12)
хорошо спасибо... 

а теперь что??? 

Код

[Linker Error] Unresolved external '__InitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '__ExitVCL' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\CP32MTI.LIB|crtlvcl
[Linker Error] Unresolved external '_main' referenced from C:\PROGRAM FILES\BORLAND\CBUILDER6\LIB\C0X32.OBJ

извините меня конечно но в С++ когда нибудь что нибудь нормально компилируется или вот так всегда? только не надо меня винить пжлст, я вот увидел здесь на форуме эти исподники захотел их скомпилировать... и вот надо же прикол =)


Мдя  smile Советую начать с 'Hello world' Как соберется, можно попробовать что нибудь посложнее, например вычислить 2+2
Как освоишь среду компиляции (любую), можно будет и в Winsock лезть
Цитата

Компилировал через Dev-C++ затем через Code::Blocks вот вчера скачал Borland C++ Builder 6 теперь такая ошибка... 
А еще есть Intel'овский компайлер, а если еще по сусекам поскрести, то можно еще штук несколько найти - у них будут другие ошибки  smile Ты бы уж определился с чем нибудь одним  smile 
Цитата

J0ker, а что ты там пишешь про хелпы свои? знаешь... если бы я знал где твои хелпы мне искать и как сними работать... поверь я бы сюда даже не заходил.
Это сильно, это 5  smile Ты все программы собираешься писать 'метода научного тыка'? ВО ВСЕХ оболочках есть какой никакой встроенный help. Да и MSDN никто не отменял.

Цитата

Добавлено @ 00:15
Решение:
Цитата

Вопрос ===============================================
16. При компиляции проекта я получаю сообщение линковщика "Unresolved external" с именем функции и указанием модуля. Как решить проблему?
Ответ ================================================
Данная ошибка говорит о том, что линковщик нашел объявление функции и функция используется в программе, но отсутствует модуль в котором эта функция реализована. Что бы устранить ошибку необходимо:
1. Ознакомиться в MSDN(http://msdn.microsoft.com) или в разделе справки билдера Windows SDK (Help\Windows SDK) с описанием функции. В конце описания как правило указывается из какого .lib файла данная функция экспортируется.
2. Зайти в папку $(BCB)\lib\psdk и найти необходимый файл.
3. Если файл найден - через Project\Add to project (или Shift+F11) добавить его в проект. Запустить компиляцию, ошибка исчезнет. Иначе следующий шаг.
4. Найдите .dll с таким же названием в системной папке.
5. Скопируйте в папку проекта.
6. Выполните утилиту $(BCB)\Bin\coff2omf c параметрами командной строки вида coff2omf dllname.dll dllnamebcb.dll
7. С получившимся файлом используйте утилиту $(BCB)\Bin\implib.exe, т.е.
implib dllnamebcb.dll dllnamebcb.lib
8. Полученую библиотеку прилинкуйте к проекту как в шаге третьем.
Кстати, я предпочитаю создавать либы а не использовать борландовские.

нет, если действительно в С++ так всегда, хых, в топку его =)))
Это метод для подключения к Borland C++ Builder не входящих в его поставку библиотек. Winsock в его поставку входит

Цитата

захожу на http://msdn.microsoft.com/ru-ru/visualc/aa336457.aspx в поиск в биваю InitVCL или ExitVCL не че не находит 
Это не удивительно - раз залезли на Borland, в нем и смотрите

Цитата

 захожу в C++ Builder 6 там Help => Windows SDK в поиске набираю InitVCL или ExitVCL  
Там кроме Windows SDK есть еще более родные для Borland'а хелпы, например по VCL (неужто из названия функций это не ясно?)

Что касается Builder'а, то по всей видимости вы попытались собрать проект как консольный с поддержкой VCL, а вам нужен обычный VCL проект (GUI)

Автор: AshHaller 29.4.2009, 15:35
Ответ прост. При создании нового рабочего "листа" уберите не нужные галочки.

Например для консольного приложения это будет выглядеть как на скрине в аттаче.


Автор: Chupik 1.5.2009, 20:26
Пример вполне рабочий(по крайней мере на Вижал с++ 2008):

Код

#pragma comment( lib, "wsock32.lib" )
#include <winsock2.h>
#include <iostream>
#include <string>
int main()
{  
    //Пакет запроса по HTTP протоколу
    std::string  packet;
    //Структура для настройки сокета
    sockaddr_in SA;
    SOCKET Sock;
    // поехали
    //1)  заполняем протокол запроса
    packet="GET /\r\n HTTP/1.0 Host: www.forum.vingrad.ru\r\n Connection: Closed\r\n" ;
    //настраиваем сокет
    SA.sin_family=AF_INET;
    SA.sin_port=htons(80);
    SA.sin_addr.S_un.S_addr=inet_addr("213.239.193.36");
    //2) собственно сами действия
    WSAData WSData;
    WSAStartup(MAKEWORD(2,0), &WSData);
    //Создаем сокет и проверяем на ошибку
    Sock = socket(AF_INET,SOCK_STREAM,0);
    if (Sock==0) 
    {
        std::cout<<"Error socket"<<std::endl;
        return -1;
    }
    //Конектимся к серверу
    if (connect(Sock,(sockaddr*)&SA,sizeof(SA))==-1) 
    {
        std::cout<<"Error connect"<<std::endl;
        return -1;
    }
    //Шлем пакет    
    send(Sock,packet.c_str(),int(packet.length()),0);
    //Принимаем пакет
    char buff[10000];
    recv(Sock, buff, sizeof(buff)-1, 0 );
    std::cout << buff<< std::endl;
    //Закрываем соект
    closesocket(Sock);
    WSACleanup();
}

Автор: crtv 5.5.2009, 17:48
Цитата(Chupik @ 1.5.2009,  20:26)
Пример вполне рабочий(по крайней мере на Вижал с++ 2008):


Попытался скомпилить на VC++ 2008 Express - выдало:
1>fls.cpp
1>c:\...\fls.cpp(5) : error C2632: недопустимый 'int' с последующим 'double'
1>c:\...\fls.cpp(9) : error C2628: недопустимый 'A' с последующим 'int' (возможно, отсутствует ';')
1>c:\...\fls.cpp(10) : error C3874: возвращаемый тип 'main' должен быть 'int', а не 'A'
1>flsss - ошибок 3, предупреждений 0
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========


Автор: xvr 5.5.2009, 18:39
Судя по ошибкам, компилировалось что то не то. На этих строках в исходнике нет ничего похожего на то, что вывелось в error'ах

Автор: crtv 5.5.2009, 18:47
Да я тоже так подумал, бред какой то... перезапустил VC создал новый проект и всё нормально откомпилилось.

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