andruxa-xaxa |
Отправлено: 10.12.2006, 15:34 |
|
Ученик-кочегар
Группа: Участник
Сообщений: 17
|
Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране??? |
|
Romikgy |
Отправлено: 10.12.2006, 20:40 |
|
Дежурный стрелочник
Группа: Участник
Сообщений: 72
|
Indy or WinInet
IMHO that |
|
AVC |
Отправлено: 11.12.2006, 09:37 |
|
Ветеран
Группа: Модератор
Сообщений: 1583
|
QUOTE (andruxa-xaxa @ 10.12.2006, 14:34) | Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране??? |
Я тоже знаю. Можно. |
|
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 скажем без отображения на экране??? |
Я тоже знаю. Можно.
Напишите пожалуйста с помощью какого компонента это можно сделать или где можно прочитать как это сделать:) |
QUOTE (andruxa-xaxa @ 10.12.2006, 14:34) | Если кто знает , подскажите пожалуйста можно ли средствами BuilderC++ сделать программу для реализации подачи определенного запроса на сервер — например на поисковую систему!
Только не сресдствами CppWebServer а чтобы можно было самому сформировать запрос и получить его в xml скажем без отображения на экране??? |
Я тоже знаю. Можно.
Напишите пожалуйста с помощью какого компонента это можно сделать или где можно прочитать как это сделать:) |
|
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???
|
Можно сказать и так. Это оператор присваивания
Текст функции AxHttpPostExecute приведен несколькими постами выше (AVC 11.12.2006, 12:59)
Если там заменить WSAErrorAsText() на что то свое то она даже станет полностью рабочей.
К одному из ответов по теме вопрос по сети., обнаружение в сети компа я прикладывал текст модуля, содержащего все нужные функции.
QUOTE |
//здесь указывается адрес к которому надо обратиться????Тогда зачем IP??
|
Я хожу в инет через прокси. Это адрес и порт прокси.
|
|