通过机器名得到IP地址(100分)

  • 主题发起人 主题发起人 puppyboy
  • 开始时间 开始时间
P

puppyboy

Unregistered / Unconfirmed
GUEST, unregistred user!
在一个局域网当中,因为服务器的ip是动态的,所以我只能通过计算机名来连接,或者通过计
算机名来得到ip地址,但是我发现,通过计算机名连接实际上还是在客户端保存的局域网机器
名和IP对应表,通过这个表得到IP然后再连接,所以现在的问题是,当服务器的IP改变了,客户
端通过计算机名得到的IP地址不是最新的,通过机器名也连接不上服务器,因为实际上使用的
还是旧的IP,请问怎么通过计算机名得到最近的服务器的IP地址?
 
//通过机器名获取IP列表
uses
WinSock;

procedure GetIPListByName(HostName: String; IPList: TStrings);
type
TaPInAddr = Array[0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe: PHostEnt;
pptr: PaPInAddr;
i: Integer;
GInitData: TWSADATA;
begin
if not Assigned(IPList) then
Exit;

try
if WSAStartup($0101,GInitData)<>ERROR_SUCCESS then
Exit;

IPList.Clear;
phe:=GetHostByName(PChar(HostName));
if phe=Nil then
Exit;

pptr:=PaPInAddr(Phe^.h_addr_list);
i:=0;
while pptr^<>nil do
begin
IPList.Add(StrPas(inet_ntoa(pptr^^)));
Inc(i);
end;
finally
WSACleanup;
end;
end;
 
这个函数不行,比如机器名为hostserver,IP为202.202.22.1,
这个函数是能够正确得到的,但是如果我马上修改他为 202.202.22.2
这个函数得到的还是202.202.22.1
 
调用 ping 计算机名
 
加一个随时知道自己的IP

unit Unit1;
interface
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, Menus, StdCtrls, ExtCtrls, Winsock; //首先要添加winsock
type
TForm1 = class(TForm)
Timer1: TTimer;
Label1: TLabel;
PopupMenu1: TPopupMenu;
Exit: TMenuItem;
procedure FormCreate(Sender: TObject);
procedure Timer1Timer(Sender: TObject);
procedure Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
procedure Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
procedure ExitClick(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

var
Form1: TForm1;
oldx,oldy: integer;//添加变量,用做移动窗体
oldIp: string;
implementation
{$R *.dfm}
function LIP : string;
type
TaPInAddr = array [0..10] of PInAddr;
PaPInAddr = ^TaPInAddr;
var
phe : PHostEnt;
pptr : PaPInAddr;
Buffer : array [0..63] of char;
I : Integer;
GInitData : TWSADATA;
begin
WSAStartup($101, GInitData);
Result := '';
GetHostName(Buffer, SizeOf(Buffer));
phe :=GetHostByName(buffer);
if phe = nil then Exit;
pptr := PaPInAddr(Phe^.h_addr_list);
I := 0;
while pptr^ <> nil do begin
result:=StrPas(inet_ntoa(pptr^^));
Inc(I);
end;
WSACleanup;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
with Label1 do //定义属性
begin
Caption:='';
Font.Charset:=ANSI_CHARSET;
Font.Name:='Arial';
Font.Size:=10;
Font.Color:=clRed;
Align:=alClient;
PopupMenu:=popupmenu1;
end;

Timer1.Interval:=1000;
Timer1.Enabled:=true;
Label1.Caption:='IP:'+LIP; oldIp:=LIP;
BorderStyle:=bsNone;
Alphablend:=true;
Alphablendvalue:=100;
FormStyle:=fsStayOnTop;
end;

procedure TForm1.Timer1Timer(Sender: TObject);
begin
Label1.Caption :='IP:'+LIP;
if oldip <> LIP then
Showmessage('IP地址已经改变,请检查!');
end;

procedure TForm1.Label1MouseMove(Sender: TObject; Shift: TShiftState; X,
Y: Integer);
begin
if ssleft in shift then //移动窗体Form1
begin
Form1.Left:=Form1.Left+x-oldx;
Form1.Top:=Form1.top+y-oldy;
end;
end;

procedure TForm1.Label1MouseDown(Sender: TObject; Button: TMouseButton;
Shift: TShiftState; X, Y: Integer);
begin
oldx:=x;
oldy:=y;
end;

procedure TForm1.ExitClick(Sender: TObject);
begin
Close;
end;
end.
 
我的感觉是windows系统为了加快网络访问,缓存了IP和计算机名的对应关系,这样当通过计算机名访问另一台机器时,系统可以马上利用这个缓存的对应关系立刻得到IP地址来访问,但是当远端的计算机名字改变之后,客户端的信息并没有更新,关键是这样的问题怎么去解决??????????????????????
 
将你的计算机上面的服务中的DNS Client服务停止。
最好将这个局域网内的这个服务都停止,那样应该管用。
 
后退
顶部