如何能得知一个IP是否存在?(50分)

  • 主题发起人 主题发起人 冰封
  • 开始时间 开始时间

冰封

Unregistered / Unconfirmed
GUEST, unregistred user!
如何能得知一个IP是否存在?
请附范例。
 
搜一下以前的,应该有很多。
 
ping一下,delphi下有相应控件好像叫echo
 
ping 或者GetHostByaddr()
 
用软件搜一下,由于没有全知道。
 
抄别人的,我试过了,甚至可以查到指定IP的共享目录。

unit Unit1;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, ExtCtrls, ComCtrls, StdCtrls, Buttons,shellapi;

type
TNetResourceArray = ^TNetResource;//网络类型的数组
TForm1 = class(TForm)
Label1: TLabel;
Label2: TLabel;
Label3: TLabel;
Label4: TLabel;
Label5: TLabel;
Label6: TLabel;
Edit1: TEdit;
BitBtn1: TBitBtn;
ScrollBox1: TScrollBox;
ListBox1: TListBox;
BitBtn2: TBitBtn;
BitBtn3: TBitBtn;
CheckBox1: TCheckBox;
Edit2: TEdit;
Edit3: TEdit;
Edit4: TEdit;
Button1: TButton;
TrackBar1: TTrackBar;
Edit5: TEdit;
Timer1: TTimer;
StatusBar1: TStatusBar;
Image1: TImage;
Label7: TLabel;
procedure TrackBar1Change(Sender: TObject);
procedure BitBtn1Click(Sender: TObject);
procedure Button1Click(Sender: TObject);
procedure BitBtn3Click(Sender: TObject);
procedure BitBtn2Click(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Label7Click(Sender: TObject);
procedure FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label7MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure CheckBox1Click(Sender: TObject);
private
{ Private declarations }
procedure WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo);//禁止窗口改变大小
message WM_GETMINMAXINFO;
public
{ Public declarations }
end;

var
Form1: TForm1;

implementation
procedure TForm1.WMGetMinMaxInfo(var Msg: TWMGetMinMaxInfo); //enable change form size
begin
inherited;
with Msg.MinMaxInfo^ do begin
ptMinTrackSize.x:= Form1.width;
ptMaxTrackSize.x:= Form1.width;
ptMinTrackSize.y:= Form1.height;
ptMaxTrackSize.y:= Form1.height;
end;
end;

Function GetUserResource( UserName : string ) : Boolean;
Var
NetResource:TNetResource;
Buf:Pointer;
Count,BufSize,Res:DWord;
Ind : Integer;
lphEnum : THandle;
Temp : TNetResourceArray;
Begin
Result := False;
FillChar(NetResource, SizeOf(NetResource), 0);//初始化网络层次信息
NetResource.lpRemoteName := @UserName[1];//指定计算机名称
//获取指定计算机的网络资源句柄
Res := WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY,
RESOURCEUSAGE_CONNECTABLE, @NetResource,lphEnum);
If Res <> NO_ERROR Then
begin
exit;//执行失败
end;
While True Do//列举指定工作组的网络资源
Begin
Count := $FFFFFFFF;//不限资源数目
BufSize := 8192;//缓冲区大小设置为8K
GetMem(Buf, BufSize);//申请内存,用于获取工作组信息
//获取指定计算机的网络资源名称
Res := WNetEnumResource(lphEnum, Count, Pointer(Buf), BufSize);
If Res = ERROR_NO_MORE_ITEMS Then break;//资源列举完毕
If (Res <> NO_ERROR) then Exit;//执行失败
Temp := TNetResourceArray(Buf);
For Ind := 0 to Count - 1 do
Begin
//获取指定计算机中的共享资源名称,+2表示删除"//",
form1.ListBox1.Items.Add(string(Temp^.lpRemoteName +2));
Inc(Temp);
End;
End;
Res := WNetCloseEnum(lphEnum);//关闭一次列举
If Res <> NO_ERROR Then
begin
exit;//执行失败
end;
Result := True;
FreeMem(Buf);
End;

{$R *.dfm}

procedure TForm1.TrackBar1Change(Sender: TObject);
begin
timer1.Interval:=trackbar1.Position*1000;
edit5.Text:=inttostr(trackbar1.Position);
end;

procedure TForm1.BitBtn1Click(Sender: TObject);
begin
listbox1.Clear;
if not checkbox1.Checked then
begin
statusbar1.Panels[0].Text:='检测中.....';
if GetUserResource('//'+edit1.Text) then listbox1.Items.Add('找到共享资源');
statusbar1.Panels[0].Text:='检测完毕!!';
end
else
begin
statusbar1.Panels[0].Text:='稍候.....';
statusbar1.Update;
timer1.Enabled:=true;
end;
// listbox1.SetFocus;
listbox1.itemindex:=0;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
timer1.Enabled:=false;
statusbar1.Panels[0].Text:='被用户强制停止';
statusbar1.Update;
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
begin
case Wnetcancelconnection('X:',False) of
0:statusbar1.Panels[0].Text:='成功断开';
50:statusbar1.Panels[0].Text:='函数不被支持';
8: statusbar1.Panels[0].Text:='系统内存不足';
59:statusbar1.Panels[0].Text:='网络发生错误';
487:statusbar1.Panels[0].Text:='无效指针';
87:statusbar1.Panels[0].Text:='无效网络名';
2250: statusbar1.Panels[0].Text:='无须断开的连接';
2401:statusbar1.Panels[0].Text:='断开的连接有打开的文件';
else
statusbar1.Panels[0].Text:='连接错误';
end;
end;

procedure TForm1.BitBtn2Click(Sender: TObject);
var
path_lsq:pchar;
begin
if ListBox1.Items.Count=0 then
application.MessageBox('共享资源中没有网络路径或是没有选中!!','玩命的警告',MB_ok+MB_Iconstop) else
begin
case Wnetcancelconnection('X:',False) of
0:statusbar1.Panels[0].Text:='成功断开';
50:statusbar1.Panels[0].Text:='函数不被支持';
8: statusbar1.Panels[0].Text:='系统内存不足';
59:statusbar1.Panels[0].Text:='网络发生错误';
487:statusbar1.Panels[0].Text:='无效指针';
87:statusbar1.Panels[0].Text:='无效网络名';
2250: statusbar1.Panels[0].Text:='无须断开的连接';
2401:statusbar1.Panels[0].Text:='断开的连接有打开的文件';
else
statusbar1.Panels[0].Text:='连接错误';
end;
case Wnetaddconnection(pchar('//'+listbox1.Items.Strings[listbox1.ItemIndex]),'111','X:') of
0:
begin
statusbar1.Panels[0].Text:='成功入侵,请察看你的资源管理器';
path_lsq:= pchar('explorer '+('//'+listbox1.Items.Strings[listbox1.ItemIndex]));
Winexec(path_lsq,SW_Show);
end;
50: statusbar1.Panels[0].Text:= '函数不被支持';
8: statusbar1.Panels[0].Text:='系统内存不足 ';
59: statusbar1.Panels[0].Text:='网络发生错误 ';
487: statusbar1.Panels[0].Text:='无效指针';
67: statusbar1.Panels[0].Text:='无效网络名';
1200:statusbar1.Panels[0].Text:='无效本地名';
85: statusbar1.Panels[0].Text:= '此连接已经建立,清先断开';
86:statusbar1.Panels[0].Text:='无效口令';
5:statusbar1.Panels[0].Text:='访问被拒绝';
else
statusbar1.Panels[0].Text:= '连接错误';
end;
end;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
begin
statusbar1.Panels[0].Text:='正在检测网段.....';
statusbar1.Update;
if GetUserResource('//'+edit2.Text+'.'+edit3.Text) then
begin
listbox1.Items.Add('找到共享资源');
timer1.Enabled:=false;
end;
if edit3.Text=edit4.Text then
begin
statusbar1.Panels[0].Text:='检测完毕';
statusbar1.Update;
timer1.Enabled:=false;
end;
edit3.Text:=inttostr(strtoint(edit3.Text)+1);
edit3.Update;
end;
end;
procedure TForm1.Label7Click(Sender: TObject);
begin
shellexecute(handle,'open',pchar('http://10.231.52.10'),nil,nil,sW_shownormal);
end;

procedure TForm1.FormMouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label7.Font.Color:=rgb(0,0,0);
end;

procedure TForm1.Label7MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
Label7.Font.Color:=rgb(0,0,255);
end;

procedure TForm1.CheckBox1Click(Sender: TObject);
begin
if checkbox1.Checked then
begin
edit2.Enabled:=true;
edit3.Enabled:=true;
edit4.Enabled:=true;
edit1.Enabled:=false;
end
else
begin
edit2.Enabled:=false;
edit3.Enabled:=false;
edit4.Enabled:=false;
edit1.Enabled:=true;
end;
end;

end.
 
我可发一我写得IP程序。
 
IP当然存在了:0
一般用icmp来ping一下可以,不过如果该机器禁止了icmp那就不行了,
有一个办法是用udp套一下,看是否弹回来
 
ping啊,有什么想的
 
ping的办法可以,但是万一别人不给你回ping的信息呢?那只好来端口扫描了,
看看有没有端口开放,如果ping不通但是可以扫到开放的端口,那就证明
这个被扫的IP对应的主机存在。但是万一扫不到一个端口呢?如果扫不到
任何一个端口我想这个IP在网上存在的意义就不大了吧?(可能对某些设备扫
不到一个端口,如机顶盒)
写端口扫描应该是最简单的网络编程吧.只要是能connect上就算是端口开放了
 
哪个把程序show一下?
 
龙星,你写的程序发给我看看。EMAIL:cds27@sina.com
 
getnamebyaddr()
 
kongg,你说的方法有程序吗?发一份给我吧
 
struct hostent FAR * gethostbyaddr (

const char FAR * addr,
int len,
int type
);
如果返回为nil说明这个IP不存在
 
一般用icmp来ping一下
 
判断一下对方有没有端口开放。这是linux下的程序,windows下的不会写,
但是这个思路是没错的。就是建个socket,然后尝试和他所有的端口连接,就是用那个
connect函数,如果能建立,那就表明这个IP肯定存在。缺点:要扫描所有的端口,速度慢
多了。使用ping,能ping的到表示这个IP肯定存在,但是如果ping
不通也不能肯定它不存在。使用gethostbyaddr(Get the Internet host name
corresponding to a given IP address),万一这个IP没有对应的名字那也没戏。

#include <stdio.h>
#include <netdb.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include<stdlib.h>
#include <sys/time.h>
int port;
int main(int argc, char *argv[])
{
struct hostent *he;
struct sockaddr_in sin;
if ((he = gethostbyname(argv[1])) == NULL)
{
exit(-1);
}
for (port=1;port<65535;port++)
{
sin.sin_family = AF_INET;
sin.sin_port = htons(port);
sin.sin_addr = *((struct in_addr *)he->h_addr);
if ((sock = socket (AF_INET, SOCK_STREAM, 6)) <= 0) //建socket。那个6通常是用0的,不过编程我喜欢用个吉利数,6也不会出错。
{
exit(-1);
}
if (!connect(sock, (struct sockaddr *)&amp;sin, sizeof(sin))) //看是否能连接的上。
{
printf ("+------Port ");
printf (RED"%5d"NONE,port);
printf (" open.------ Scan type: ");
printf (RED"tcp connect"NONE);
printf ("---------------------------+/n"); //把开放的给打出来。
}
close(sock);
}
}
 
我有最好的办法,那就是去连这个IP的445端口,如果不能连上99%该IP不在线
 
后退
顶部