1,593
社区成员
发帖
与我相关
我的任务
分享
unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls,Winsock;
type
TForm1 = class(TForm)
Button2: TButton;
Button1: TButton;
procedure FormCreate(Sender: TObject);
procedure Button2Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;
var
Form1: TForm1;
implementation
{$R *.dfm}
var
piTimeOut:integer=3; //延迟
Function TryIPPort(Const IP : AnsiString; Port : integer) : Boolean;
var
Sock : TSocket;
SA : TSockaddr;
n , ul : integer;
TV : TTimeVal;
FDSet : TFDSet;
begin
FillChar(SA , SizeOf(SA) , 0);
SA.sin_family := AF_INET;
SA.sin_port := htons(Port);
SA.sin_addr.S_addr := inet_addr(Pointer(IP));
Sock := Socket(AF_INET , SOCK_STREAM , IPPROTO_IP);
Result := Sock<>invalid_socket;
if Result then begin
n := piTimeOut * 1000; //3秒超时
ul := 1;
if (SetSockopt(Sock , SOL_SOCKET , SO_SNDTIMEO , @n , SizeOf(n))<>SOCKET_ERROR) and
(SetSockopt(Sock , SOL_SOCKET , SO_RCVTIMEO , @n , SizeOf(n))<>SOCKET_ERROR) and
(ioctlsocket(Sock, FIONBIO, ul)<>SOCKET_ERROR) then begin
Connect(Sock , SA , SizeOf(SA));
FD_ZERO(FDSet);
FD_SET(Sock , FDSet);
TV.tv_sec := piTimeOut;
TV.tv_usec := 0;
Result := select(0, NIL , @FDSet , NIL , @TV)>0;
end;
CloseSocket(Sock);
end;
end;
procedure TForm1.FormCreate(Sender: TObject);
var
WSA : TWSAData;
begin
WSAStartup(MakeWord(2,2),WSA);
end;
procedure TForm1.Button1Click(Sender: TObject);
begin
if TryIPPort('110.75.161.108',16000) then ShowMessage('True') else ShowMessage('False');
end;
procedure TForm1.Button2Click(Sender: TObject);
begin
if TryIPPort('110.75.161.108',9999) then ShowMessage('True') else ShowMessage('False'); //应该连不上的,他提示True
end;
//这个IP110.75.161.108 的16000是开放的 9999端口是关闭的 ,但是怎么连都返回True ,不信你试一下
end.
uses WinSock;
function ScanTCPPort(ip: string; port: Word): Boolean;
var
sin: sockaddr_in;
li_socket, err: Integer;
wVersionRequested: Word;
wsaData: TWSAData;
begin
Result := False;
try
wVersionRequested := MAKEWORD(2, 0);
err := WSAStartup(wVersionRequested, wsaData);
if ( err <> 0 ) then
Exit;
li_socket := socket(AF_INET,SOCK_STREAM, 0);
if li_socket < 0 then
Exit;
ZeroMemory(@sin, sizeof(sin));
sin.sin_family := AF_INET;
sin.sin_addr.s_addr := inet_addr(PChar(ip));
sin.sin_port := htons(port);
if connect(li_socket, sin, sizeof(sin)) < 0 then
Exit;
finally
closesocket(li_socket);
end;
Result := True;
end;
Function TryIPPort(Const IP : AnsiString; Port : integer) : Boolean;
var
Sock : TSocket;
SA : TSockaddr;
n , ul : integer;
TV : TTimeVal;
FDSet : TFDSet;
begin
FillChar(SA , SizeOf(SA) , 0);
SA.sin_family := AF_INET;
SA.sin_port := htons(Port);
SA.sin_addr.S_addr := inet_addr(Pointer(IP));
Sock := Socket(AF_INET , SOCK_STREAM , IPPROTO_IP);
Result := Sock<>invalid_socket;
if Result then begin
n := 3 * 1000; //3秒超时
ul := 1;
if (SetSockopt(Sock , SOL_SOCKET , SO_SNDTIMEO , @n , SizeOf(n))<>SOCKET_ERROR) and
(SetSockopt(Sock , SOL_SOCKET , SO_RCVTIMEO , @n , SizeOf(n))<>SOCKET_ERROR) and
(ioctlsocket(Sock, FIONBIO, ul)<>SOCKET_ERROR) then begin
Connect(Sock , SA , SizeOf(SA));
FD_ZERO(FDSet);
FD_SET(Sock , FDSet);
TV.tv_sec := piTimeOut;
TV.tv_usec := 0;
Result := select(0, NIL , @FDSet , NIL , @TV)>0;
end;
CloseSocket(Sock);
end;
end;