Загрузка файла из инета.

Discussion in 'С/С++, C#, Rust, Swift, Go, Java, Perl, Ruby' started by Proger10, 26 Nov 2009.

  1. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    Вопрос конечно не первый раз задается, но что нашел или не работает или еше что-нибудь. Ну так как сделать сабж, IdHTTP не предлагать!!
     
  2. Ins3t

    Ins3t Харьковчанин

    Joined:
    18 Jul 2009
    Messages:
    939
    Likes Received:
    429
    Reputations:
    139
    2Nightmarе, не проще ли воспользоваться API функцией UrlDownloadToFile()
     
  3. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    2Ins3t, в моем случае не проще.
    2Nightmarе, спасибо, то что надо!
    А еше некто не поделится как проверить наличие возможности подключения к серверу по определенному порту(80)?? Желетельно через WinInet.
     
  4. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    Вот попытался сделать через winsAck:
    Code:
    procedure TForm1.Button1Click(Sender: TObject);
    var
      WSAData: TWSAData;
      S: TSocket;
      SockAddrIn: TSockAddr;
      Timeout: TTimeVal;
    begin
      if WSAStartup($101, WSAData)<>0 then
        exit;
      SockAddrIn.sin_family:=AF_INET;
      SockAddrIn.sin_addr.S_addr:=inet_addr(pchar(Edit1.Text));
      S:=socket(AF_INET,SOCK_STREAM,0);
      if S=INVALID_SOCKET then
        Exit;
      Timeout.tv_usec := 0;
      Timeout.tv_sec := 1000;
      setsockopt(S, SOL_SOCKET, SO_RCVTIMEO, @Timeout, sizeof(TTimeVal));
      SockAddrIn.sin_port:=htons(StrToInt(Edit2.Text));
      if connect(S, SockAddrIn, sizeof(SockAddrIn))=0 Then
      begin
        ShowMessage('Тут кто-то есть!');
      end
      else
      begin
        ShowMessage('Никого нет!');
      end;
    end;
    
    Если на порте кто-то есть, то все отлично программа вполне быстро сообщает об этом, а если там никого нет, то проходит секунд десять до соответствующего сообшения, попытался добаввить таймаут - нифига не получилось.. Что не так??
     
  5. Proger10

    Proger10 Member

    Joined:
    19 Dec 2008
    Messages:
    80
    Likes Received:
    7
    Reputations:
    0
    Где то прочитал что в Индюке эта проблема решается с помощю второго потока, сделал - вроде получилось.
    Unit1:
    Code:
    unit Unit1;
    
    interface
    
    uses
      Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
      Dialogs, StdCtrls, WinSock, ExtCtrls, Unit2;
    
    type
      TForm1 = class(TForm)
        Button1: TButton;
        Edit1: TEdit;
        Edit2: TEdit;
        procedure Button1Click(Sender: TObject);
      private
        { Private declarations }
      public
        { Public declarations }
        CanConnect: boolean;
        CanConnectChanged: boolean;
      end;
    
    var
      Form1: TForm1;
    
    implementation
    
    {$R *.dfm}
    
    procedure TForm1.Button1Click(Sender: TObject);
    var
      I: Integer;
    begin
      CanConnect:=False;
      Ping:= TPingThread.Create(True);
      Ping.IP:=Edit1.Text;
      Ping.Port:=StrToInt(Edit2.Text);
      Ping.Suspended:=False;
      for I := 1 to 1000 do
      begin
        Sleep(1);
        Application.ProcessMessages;
      end;
      if not CanConnectChanged then
      begin
        Ping.Suspended:=True;
        CanConnect:=False;
      end;
      if Canconnect then
        ShowMessage('We are TRUE!!')
      else
        ShowMessage('We are FALSE!!');
    end;
    
    
    end.
    Unit2:
    Code:
    unit Unit2;
    
    interface
    
    uses
      Classes, WinSock;
    
    type
      TPingThread = class(TThread)
        IP: string;
        Port: integer;
      private
        { Private declarations }
      protected
        procedure Execute; override;
      end;
    
    var
      Ping: TPingThread;
    
    implementation
    
    uses Unit1;
    
    { Important: Methods and properties of objects in visual components can only be
      used in a method called using Synchronize, for example,
    
          Synchronize(UpdateCaption);
    
      and UpdateCaption could look like,
    
        procedure TPingThread.UpdateCaption;
        begin
          Form1.Caption := 'Updated in a thread';
        end; }
    
    { TPingThread }
    
    procedure TPingThread.Execute;
    var
      WSAData: TWSAData;
      S: TSocket;
      SockAddrIn: TSockAddr;
    begin
      if WSAStartup($101, WSAData)<>0 then
        exit;
      SockAddrIn.sin_family:=PF_INET;
      SockAddrIn.sin_addr.S_addr:=inet_addr(pchar(IP));
      S:=socket(AF_INET,SOCK_STREAM,0);
      if S=INVALID_SOCKET then
        Exit;
      SockAddrIn.sin_port:=htons(Port);
      if connect(S, SockAddrIn, sizeof(SockAddrIn))=0 Then
      begin
        Form1.CanConnectChanged:=True;
        Form1.CanConnect:=True;
      end
      else
      begin                           
        Form1.CanConnectChanged:=True;
        Form1.CanConnect:=False;
      end;
    end;
    
    end.
    Низнаю правельно ли так делать!