
Шустрый

Профиль
Группа: Участник
Сообщений: 149
Регистрация: 2.12.2006
Репутация: нет Всего: 1
|
Придумал программулину для авто чтения данных о котировках валют, погоде и т.д. с Яндекса. Прога соединяется с Инетом, заходит на Яндекс, берет данные, выводит на экран и отключает Инет. Через некоторое время опять соединяется и т.д. Соединение использую dial-up. Пока что таймер не делал, прога в данном варианте постоянно соед./разъед. с Инетом. Иногда работа нарушается и выскакивает сообщение: Socket Error # 10054 Connection reset by peer. Что оно означает? Прога запускается нажатием Button2 - если соединения в данный момент нет - идет подключение. Вобщем прога работает нестабильно. В чем я сделал ошибку? На ваш профессиональный взгляд ошибки сразу будут видны. Подскажите, пожалста. | Код | unit Autolook_P;
interface
uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdHttp, StdCtrls, ComCtrls, ActiveX, MsHtml, IdBaseComponent, IdCookieManager, IdComponent, IdTCPConnection, IdTCPClient, IdIntercept, IdSocks, IdIOHandler, IdIOHandlerSocket, IdSSLOpenSSL, WinInet, Registry, WinSock;
type TForm1 = class(TForm) Button2: TButton; Button3: TButton; RichEdit1: TRichEdit; IdHTTP1: TIdHTTP;
procedure Button2Click(Sender: TObject); procedure Button3Click(Sender: TObject); private { Private declarations }
procedure Connect(N,s:string); public { Public declarations } end;
var Form1: TForm1;
implementation
{$R *.dfm}
var C:integer=0; //Счетчик заходов на сайт
// Поиск данных ----------------------------------------------------------------- procedure TForm1.Connect(N,s:string); var i:integer; begin if s<>'' then begin i:=Pos(AnsiLowerCase('Котировки'),AnsiLowerCase(s)); if i<=0 then begin RichEdit1.Lines.Add('Ошибка'); exit; end else begin . . - здесь чтение данных и т.д. . end; end; end;
function IsConnection(URL:string):boolean; var hSession,hfile: hInternet; dwindex,dwcodelen: dword; dwcode: array[1..20] of char; res: pchar; begin Result:= false; if URL = '' then exit; hSession:= InternetOpen('InetURL:/1.0',INTERNET_OPEN_TYPE_PRECONFIG,nil, nil, 0); if assigned(hsession) then begin hfile:= InternetOpenUrl(hsession,pchar(URL),nil,0,INTERNET_FLAG_RELOAD,0); dwIndex:= 0; dwCodeLen:= 10; HttpQueryInfo(hfile,HTTP_QUERY_STATUS_CODE,@dwcode,dwcodeLen,dwIndex); res:= pchar(@dwcode); result:= (res ='200') or (res ='302'); if assigned(hfile) then InternetCloseHandle(hfile); InternetCloseHandle(hsession); end; end;
//------------------------------------------------------------------------------ //------------------------------------------------------------------------------ procedure TForm1.Button2Click(Sender: TObject); var lData: TStringList; N,s:string; url:string; begin // проверка подключения к Интернету: если соединения нет - подключиться: url:='http://www.yandex.ru/'; if IsConnection(url) then RichEdit1.Lines.Add('Есть подключение к Интернету!') else begin RichEdit1.Lines.Add('Подключение к Интернету отсутствует...'); Button2Click(Sender); end;
N:='yandex.ru/ '; lData := TStringList.Create;
try IdHTTP1.Post('http://www.yandex.ru/', lData); finally lData.Free; end;
try s:=IdHTTP1.Get('http://www.yandex.ru/'); Connect(N,s); //Проверка подключения except N:='yandex.ru/: Нет соединения с сервером...'; s:=''; Connect(N,s); //Вывод результата на экран end;
Button3Click(Sender); Button2Click(Sender); end;
// Отключить соединение
procedure TForm1.Button3Click(Sender: TObject); type PRasConn=^TRasConn; TRasConn=record dwSize:DWord; hRasConn:THandle; szEntryName:array [0..20] of Char; end; TRasHangUp=function(hRasConn:THandle):DWord; stdcall; TRasEnumConnections=function(RasConn:PChar; var bSize:DWord; var ConnCount:DWord):DWord; stdcall; var RasApi:Cardinal; RasEnumConnections:TRasEnumConnections; RasHangUp:TRasHangUp; bSize,ConnCount,j:DWord; RasConn:TRasConn; ArrRasConn,RasOld:PChar; begin RasApi:=LoadLibrary('RasApi32.dll'); if RasApi<>0 then begin RasEnumConnections:=GetProcAddress(RasApi,'RasEnumConnectionsA'); RasHangUp:=GetProcAddress(RasApi,'RasHangUpA'); if (Assigned(RasEnumConnections))and(Assigned(RasHangUp)) then begin bSize:=0; RasConn.dwSize:=SizeOf(TRasConn); RasEnumConnections(@RasConn,bSize,ConnCount); if bSize>0 then begin RichEdit1.Lines.Add('Активных Dial-Up соединений: '+IntToStr(ConnCount)); try GetMem(ArrRasConn,bSize); PRasConn(ArrRasConn)^.dwSize:=SizeOf(TRasConn); j:=bSize; RasOld:=ArrRasConn; if RasEnumConnections(ArrRasConn,j,ConnCount)=0 then for j:=1 to ConnCount do begin RichEdit1.Lines.Add('Соединение '+IntToStr(j)+':'); RichEdit1.Lines.Add(' - Дескриптор: '+IntToStr(PRasConn(ArrRasConn)^.hRasConn)); RichEdit1.Lines.Add(' - Название: '+PRasConn(ArrRasConn)^.szEntryName); Inc(C); RichEdit1.Lines.Add('Соединение №'+IntToStr(C)); RichEdit1.Lines.Add(''); {Отключаем соединение} try while RasHangUp(PRasConn(ArrRasConn)^.hRasConn)=0 do begin Application.ProcessMessages; Sleep(0); end; except end; inc(PRasConn(ArrRasConn)); end; FreeMem(RasOld,bSize); except end; end; end; FreeLibrary(RasApi); end; end;
end.
|
--------------------
Судя по всему, у меня огромное количество мозгов - мне требуется уйма времени, чтобы ими пораскинуть
|