Вопрос конечно не первый раз задается, но что нашел или не работает или еше что-нибудь. Ну так как сделать сабж, IdHTTP не предлагать!!
2Ins3t, в моем случае не проще. 2Nightmarе, спасибо, то что надо! А еше некто не поделится как проверить наличие возможности подключения к серверу по определенному порту(80)?? Желетельно через WinInet.
Вот попытался сделать через 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; Если на порте кто-то есть, то все отлично программа вполне быстро сообщает об этом, а если там никого нет, то проходит секунд десять до соответствующего сообшения, попытался добаввить таймаут - нифига не получилось.. Что не так??
Где то прочитал что в Индюке эта проблема решается с помощю второго потока, сделал - вроде получилось. 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. Низнаю правельно ли так делать!