C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Запрос на сервер, Запрос на сервер
andruxa-xaxa
Отправлено: 10.12.2006, 15:34


Ученик-кочегар

Группа: Участник
Сообщений: 17



Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране???
Romikgy
Отправлено: 10.12.2006, 20:40


Дежурный стрелочник

Группа: Участник
Сообщений: 72



Indy or WinInet
IMHO that wink.gif
AVC
Отправлено: 11.12.2006, 09:37


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE (andruxa-xaxa @ 10.12.2006, 14:34)
Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране???

Я тоже знаю. Можно. smile.gif
andruxa-xaxa
Отправлено: 11.12.2006, 12:39


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE (AVC @ 11.12.2006, 09:37)
QUOTE (andruxa-xaxa @ 10.12.2006, 14:34)
Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране???

Я тоже знаю. Можно. smile.gif
Напишите пожалуйста с помощью какого компонента это можно сделать или где можно прочитать как это сделать:)

QUOTE (andruxa-xaxa @ 10.12.2006, 14:34)
Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране???

Я тоже знаю. Можно. smile.gif

Напишите пожалуйста с помощью какого компонента это можно сделать или где можно прочитать как это сделать:)
olegenty
Отправлено: 11.12.2006, 13:42


Ветеран

Группа: Модератор
Сообщений: 2412



недостаточно условий (ограничений) для ответа

это можно сделать на чистом Winsock
это можно сделать на компонентах Indy кучей способов
это можно сделать на компонентах ICS
это можно сделать на компонентах Midware

это можно сделать с использованием СУБД или без неё. если с ней, то по прежнему можно сделать, как сказано выше, либо воспользоваться компонентами для работы с БД. а это можно сделать посредством универсальных компонентов доступа к данным (BDE — отстой, ODBC (mODBC), ADO), либо посредством специальных компонентов (зависит от используемой СУБД, например Interbase — IBX, FIBPlus; Firebird — FIBPlus; MSSQL — ADO, SDAC; Oracle — ODAC, DOA, NOCI; MySQL — MySQL DAC и так далее).

так что ты уж поясни, какие ещё наложены ограничения (дано, требуется, etc...)


AVC
Отправлено: 11.12.2006, 13:59


Ветеран

Группа: Модератор
Сообщений: 1583



Вариант на сокетах
Где то сделано такое
QUOTE

WORD wVersionRequested = 0x0101; // MAKEWORD(2,0);;
WSADATA  wsaData;
int  err;

// инициализируем Socket'ы
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) // Tell the user that we couldn't find a usable WinSock DLL.
 throw Exception ("WSAStartup Error Code: " + WSAErrorAsText());

if (wsaData.wVersion != wVersionRequested)
 throw Exception ("WinSock version 1.1 not supported");

// И незабыть потом такое
//WSACleanup(); // деинициализаци socket'ов



QUOTE

//---------------------------------------------------------------------------
// Выполнить отправку запроса по http и дождаться ответа
//   пока ленивый вариант (без анализа на http1/1 и ответ не более 65k байт)
//  Exception при ошибках
//---------------------------------------------------------------------------

PACKAGE AnsiString __fastcall  AxHttpPostExecute
   (SOCKET            &pSocket
   ,const AnsiString  &IP
   ,int                Port
   ,const AnsiString  &PostText
   ,int                waitms         // ждать овет ms 0-не ждать
   )
{
int     ret;
if (pSocket != INVALID_SOCKET)
{   closesocket(pSocket);
    pSocket = INVALID_SOCKET;
}

pSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
if (pSocket == INVALID_SOCKET)  throw Exception(" socket error " + WSAErrorAsText());

// Устанавливаем предельное время ожидания ответа
int timeout = 3000;
if (waitms> 0) timeout = waitms;

setsockopt(pSocket, SOL_SOCKET, SO_RCVTIMEO, (char*)&timeout, sizeof(timeout));

sockaddr_in sadr_trg;
sadr_trg.sin_family      = AF_INET;
sadr_trg.sin_addr.s_addr = inet_addr(IP.c_str());
sadr_trg.sin_port        = htons    (Port);

ret = connect(pSocket, (sockaddr*)&sadr_trg, sizeof(sadr_trg));
if (ret == SOCKET_ERROR)  throw Exception(" connect error " + WSAErrorAsText());


ret = send(pSocket, PostText.c_str(), PostText.Length(), 0);
if (ret == SOCKET_ERROR)  throw Exception(" send error " + WSAErrorAsText());

AnsiString  answertext = "";
if (waitms> 0)
{      char buf[0xFFF0];     memset(buf, 0x00, sizeof(buf));
       int  rcou = 0;
       int  retr = recv(pSocket, buf, sizeof(buf), 0 /*MSG_PEEK*/);
       if (retr == SOCKET_ERROR)
        {      AnsiString      errmsg = " recv error " + WSAErrorAsText();
               closesocket(pSocket);   pSocket = INVALID_SOCKET;
               throw Exception(errmsg);
        }
       while(retr> 0)
        {      rcou += retr;
               retr  = recv(pSocket, buf+rcou, sizeof(buf) — rcou, 0);

// в конце текста html стоит 0D0A300D0A0D0A (для HTTP/1.1 и chunced)
               if ((buf[rcou+retr-7] & 0xFF) == 0x0D   &&
                       (buf[rcou+retr-6] & 0xFF) == 0x0A       &&
                       (buf[rcou+retr-5] & 0xFF) == 0x30       &&
                       (buf[rcou+retr-4] & 0xFF) == 0x0D       &&
                       (buf[rcou+retr-3] & 0xFF) == 0x0A       &&
                       (buf[rcou+retr-2] & 0xFF) == 0x0D       &&
                       (buf[rcou+retr-1] & 0xFF) == 0x0A               )
                {
                       break;
                }
        }
       answertext = AnsiString(buf);
}

ret = closesocket(pSocket);
if (ret == SOCKET_ERROR)  hrow Exception(" close connect error " + WSAErrorAsText());

pSocket = INVALID_SOCKET;
return answertext;
}
andruxa-xaxa
Отправлено: 11.12.2006, 14:23


Ученик-кочегар

Группа: Участник
Сообщений: 17



На самом деле необходимо написать программу которая могла бы обратиться к поисковой системе с запросом и отпарсить ответ или сохранить его в файле на диске? Это такое задание? Я просто не знаю компонентов которые бы позволяли получить ответ без открытия браузера! Если скажем мне известно что надо обратиться к google.ru/search?q="Привет" но я не знаю есть ли компонент в Biulder который мог бы попросить google отдать ответ в xml или скажем в текстовом формате — я знаю только вариант с открытием страницы в ьраузере(ShellExecute).
Я извиняюсь если неправильно сформулировал вопрос?
Если можете подскажите с помощью чего это можно реализовать?
olegenty
Отправлено: 11.12.2006, 14:38


Ветеран

Группа: Модератор
Сообщений: 2412



TidHttp — на Indy
THttpCli — на ICS (overbyte.be, компоненты бесплатны)
andruxa-xaxa
Отправлено: 11.12.2006, 14:54


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE (olegenty @ 11.12.2006, 14:38)
TidHttp — на Indy
THttpCli — на ICS (overbyte.be, компоненты бесплатны)

Заранее спасибо большое за помощь!
AVC
Отправлено: 11.12.2006, 15:03


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

которая могла бы обратиться к поисковой системе с запросом и отпарсить ответ или сохранить его в файле на диске


Ну ладно, сказав А говорю и Б
CODE

void __fastcall TForm1::Bt_GetHttpClick(TObject *Sender)
{
SOCKET sock = INVALID_SOCKET;

AnsiString text =
   AxHttpPostExecute
(sock
,"10.111.96.240"
,8080
,"\
GET http://www.rxlib.ru/forums/index.php?s=9de...t=ST&f=3&t=9113 HTTP/1.0\r\n\
Accept: */*\r\n\
Accept-Language: ru\r\n\
Pragma: no-cache\r\n\
User-Agent: a_ono_nada\r\n\
Host: www.rxlib.ru\r\n\
Proxy-Connection: Keep-Alive\r\n\
\r\n\
"
,15000
   );
int pos = text.Pos("\r\n\r\n");
if (pos > 0) text = text.SubString(pos+4, text.Length());

TStringList *lst = new TStringList();
lst->Text = text;
lst->SaveToFile(ExtractFilePath(Application->ExeName) + "answer1.htm");
delete lst;

//Memo1->Lines->Text = text;
}

andruxa-xaxa
Отправлено: 11.12.2006, 18:11


Ученик-кочегар

Группа: Участник
Сообщений: 17



QUOTE (AVC @ 11.12.2006, 15:03)
QUOTE

которая могла бы обратиться к поисковой системе с запросом и отпарсить ответ или сохранить его в файле на диске


Ну ладно, сказав А говорю и Б
CODE

void __fastcall TForm1::Bt_GetHttpClick(TObject *Sender)
{
SOCKET sock = INVALID_SOCKET;

AnsiString text =
   AxHttpPostExecute
(sock
,"10.111.96.240"
,8080
,"\
GET [URL=http://www.rxlib.ru/forums/index.php?s=9deb88674dc00a93bff0bda1755bf088&act=ST&f=3&t=9113]http://www.rxlib.ru/forums/index.php?s=9de...t=ST&f=3&t=9113[/URL] HTTP/1.0\r\n\
Accept: */*\r\n\
Accept-Language: ru\r\n\
Pragma: no-cache\r\n\
User-Agent: a_ono_nada\r\n\
Host: www.rxlib.ru\r\n\
Proxy-Connection: Keep-Alive\r\n\
\r\n\
"
,15000
   );
int pos = text.Pos("\r\n\r\n");
if (pos > 0) text = text.SubString(pos+4, text.Length());

TStringList *lst = new TStringList();
lst->Text = text;
lst->SaveToFile(ExtractFilePath(Application->ExeName) + "answer1.htm");
delete lst;

//Memo1->Lines->Text = text;
}

Извините ради Бога — можно задать несколько вопросов по коду?

void __fastcall TForm1::Bt_GetHttpClick(TObject *Sender)
{
SOCKET sock = INVALID_SOCKET;

AnsiString text =

//это встроенная функция Builder???

AxHttpPostExecute
(sock

//здесь указывается чей IP — поисковой системы или свой
,"10.111.96.240"
,8080
,"\
//здесь указывается адрес к которому надо обратиться????Тогда зачем IP??
GET http://www.rxlib.ru/forums/index.php?s=9de...t=ST&f=3&t=9113 HTTP/1.0\r\n\
Accept: */*\r\n\
Accept-Language: ru\r\n\
Pragma: no-cache\r\n\
User-Agent: a_ono_nada\r\n\
Host: www.rxlib.ru\r\n\
Proxy-Connection: Keep-Alive\r\n\
\r\n\
"
,15000
);
int pos = text.Pos("\r\n\r\n");
if (pos> 0) text = text.SubString(pos+4, text.Length());

TStringList *lst = new TStringList();
lst->Text = text;
lst->SaveToFile(ExtractFilePath(Application->ExeName) + "answer1.htm");
delete lst;

//Memo1->Lines->Text = text;
}

Извините если замучил!!!
Буду очень Вам благодарен если ответите!!!
AVC
Отправлено: 12.12.2006, 13:42


Ветеран

Группа: Модератор
Сообщений: 1583



QUOTE

AnsiString text =
//это встроенная функция Builder???

Можно сказать и так. Это оператор присваивания smile.gif

Текст функции AxHttpPostExecute приведен несколькими постами выше (AVC 11.12.2006, 12:59)
Если там заменить WSAErrorAsText() на что то свое то она даже станет полностью рабочей.
К одному из ответов по теме вопрос по сети., обнаружение в сети компа я прикладывал текст модуля, содержащего все нужные функции.

QUOTE

//здесь указывается адрес к которому надо обратиться????Тогда зачем IP??

Я хожу в инет через прокси. Это адрес и порт прокси.


Вернуться в Вопросы программирования в C++Builder