Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Сети > Автоматич. чтение данных с Яндекса


Автор: Vladimir_K 13.1.2008, 00:58
Придумал программулину для авто чтения данных о котировках валют, погоде и т.д. с Яндекса.
Прога соединяется с Инетом, заходит на Яндекс, берет данные, выводит на экран и отключает Инет.
Через некоторое время опять соединяется и т.д.
Соединение использую 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.

Автор: ne0n 13.1.2008, 17:06
Цитата

WSAECONNRESET (10054)
•    Translation: Connection reset by peer.
•    Description: An existing connection was forcibly closed by the remote host. This error typically occurs if the peer program on the remote host is suddenly stopped, the host is restarted, or the remote host uses a hard close. See setsockopt (Wsapiref_94aa.asp) for more information about the SO_LINGER option on the remote socket. This error may also result if a connection was broken because of keep-alive activity that detects a failure while one or more operations are in progress. Operations that were in progress fail with WSAENETRESET. Subsequent operations fail with WSAECONNRESET. 


судя по описанию ошибки,  проблема может быть и не в программе smile 

Автор: Vladimir_K 13.1.2008, 17:43
Понял, спасибо.
Прога, в принципе, работает нормально. Эта ошибка появляется редко.
Буду дальше разбираться.

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