怎样得到所有已经连入局域网的电脑的IP?(100分)

  • 主题发起人 主题发起人 小乖
  • 开始时间 开始时间

小乖

Unregistered / Unconfirmed
GUEST, unregistred user!
只要能得到网上邻居中所有电脑的IP就可以。

用来做一个局域网的通信服务器

谢谢。
 
密切关注
 
查找所有网络计算机
调用FindComputers,返回WinAPI错误代码(如果有的话)。这个函数将会在TStringList类型的Computers对象中填入计算机名称。
以下代码是在Delphi5上开发的,但是应该是向后兼容的。
unit FindComp;
interface
uses
Windows, Classes;
function FindComputers: DWORD;
var
Computers: TStringList;
implementation
uses
SysUtils;
const
MaxEntries = 250;
function FindComputers: DWORD;
var
EnumWorkGroupHandle, EnumComputerHandle: THandle;
EnumError: DWORD;
Network: TNetResource;
WorkGroupEntries, ComputerEntries: DWORD;
EnumWorkGroupBuffer, EnumComputerBuffer: array[1..MaxEntries] of TNetResource;
EnumBufferLength: DWORD;
I, J: DWORD;
begin
Computers.Clear;
FillChar(Network, SizeOf(Network), 0);
with Network do
begin
dwScope := RESOURCE_GLOBALNET;
dwType := RESOURCETYPE_ANY;
dwUsage := RESOURCEUSAGE_CONTAINER;
end;
EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @Network, EnumWorkGroupHandle);
if EnumError = NO_ERROR then
begin
WorkGroupEntries := MaxEntries;
EnumBufferLength := SizeOf(EnumWorkGroupBuffer);
EnumError := WNetEnumResource(EnumWorkGroupHandle, WorkGroupEntries, @EnumWorkGroupBuffer, EnumBufferLength);
if EnumError = NO_ERROR then
begin

for I := 1 to WorkGroupEntries do

begin

EnumError := WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, @EnumWorkGroupBuffer, EnumComputerHandle);

if EnumError = NO_ERROR then

begin

ComputerEntries := MaxEntries;

EnumBufferLength := SizeOf(EnumComputerBuffer);

EnumError := WNetEnumResource(EnumComputerHandle, ComputerEntries, @EnumComputerBuffer, EnumBufferLength);

if EnumError = NO_ERROR then

for J := 1 to ComputerEntries do

Computers.Add(Copy(EnumComputerBuffer[J].lpRemoteName, 3, Length(EnumComputerBuffer[J].lpRemoteName) - 2));

WNetCloseEnum(EnumComputerHandle);

end;

end;

end;

WNetCloseEnum(EnumWorkGroupHandle);

end;



if EnumError = ERROR_NO_MORE_ITEMS then

EnumError := NO_ERROR;

Result := EnumError;
end;

initialization
Computers := TStringList.Create;
finalization
Computers.Free;
end.
 
gonghh:
能否将源文件调试过后发给我?
谢谢 supersensen@163.com
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1186203
我所贴的内容也是从别的地方转贴过来,但是经过了测试。
 
要简单还是用ping吧,然后开始扫描前手工指定IP地址范围,如192.168.0.1-192.168.0.255
 
TO 小乖:
对不起,我没时间做,我也不常用DELPHI。我有BCB的代码。功能还有
internet在线检测,局域网通信服务。要否?
 
比较笨但是实用的办法:直接ping网络邻居中的计算机名,就可以看到IP了
 
yueer:
thanku very much.,but how can i get the computer's name in network neighbourhood ? can u give me the code? or *.dpr ?

gonghh:
no thanks :)
 
iie:
ping what? how to know the computer names in network neighbourhood ?
 
icmp取得IP段内机器,ARP取得计算机名
 
iie:
can u tell me amply? thanku ,i'll give u score :)
 
用net view命令
var
temp:string;
begin
temp:='c:/temp.txt';
if fileexists(temp) then
delete(temp);
winexec(pchar('command.com /c net view>'+temp);
while not fileexists(temp) do
sleep(2000);
memo1.lines.loadfromfile(temp);
end;
 
这只是得到了计算机名列表
然后利用gethostbyname就可以得到该机的ip
 
你们一个局域网的 IP 的前三断应该是相同的吧? 比如 192.168.0.X
那么可能的 IP 地址就 192.168.0.1 ~ 192.168.0.255 而已
用一个循环 Ping 一下每个 IP 不就 OK 了?

for i := 0 to IPList.Count - 1 do
begin
if AbortTest then
Break;
CurrIP := IPList;
StatusBar.Panels[0].Text := Format('Testing %s ...', [CurrIP]);
IdIcmp.Host := CurrIP;
IdIcmp.Ping;
Application.ProcessMessages;
if PingSucc then
begin
HostName := GetHostName(CurrIP);
ListBox.Items.Add(Format('IP: %-15s Ping: %-3dms Name: %s',
[CurrIP, PingTime, HostName]));
ListBox.Update;
end;
end;
StatusBar.Panels[0].Text := 'Test finish.';

IPList.Free;
 
我有现成的程序,功能比你要的多,怎么给你?
 
seagod007:
谢谢!supersensen@163.com
 
控件:
BitBtn1: TBitBtn;
memo1:TMemo;//显示结果
Edit1:TEdit;//输入工作组名
type
TNetResourceArray=^TNetResource;
TForm1=class(TForm);
//……
function TForm1.GetUsers(GroupName:String;var List:TStringList):Boolean;
var
NetResource:TNetResource;
Buf:Pointer;
Count,BufSize,Res:DWord;
Ind:Integer;
lphEnum:THandle;
Temp:TNetResourceArray;
begin
Result:=False;
Buf:=nil;
List.Clear;
FillChar(NetResource,SizeOf(NetResource),0);//初始化网络层次信息
NetResource.lpRemoteName:=@GroupName[1];//指定工作组名称
NetResource.dwDisplayType:=RESOURCEDISPLAYTYPE_SERVER;//类型为服务器(工作组)
NetResource.dwUsage:=RESOURCEUSAGE_CONTAINER;
NetResource.dwScope:=RESOURCETYPE_DISK;
Res:=WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_DISK,RESOURCEUSAGE_CONTAINER,@NetResource,lphEnum);
If Res<>NO_ERROR then Exit;//执行失败
While True do
begin
Count:=$FFFFFFFF;//不限资源数目
BufSize:=8129;//缓冲区大小设置为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
List.Add(Temp^.lpRemoteName);
Inc(Temp);
end;
end;
Res:=WNetCloseEnum(lphEnum);//关闭一次列举
If Res<>NO_ERROR Then exit;//执行失败
Result:=True;
FreeMem(Buf);
end;

procedure TForm1.BitBtn3Click(Sender: TObject);
var
List:TStringList;
i:Integer;
Domain:String;
begin
memo1.Clear;
DoMain:=Edit1.Text;
try
List:=TStringList.Create;
if GetUsers(DoMain,List) then
if List.Count=0 then
begin
memo1.Lines.Add(DoMain+'工作组下没有计算机!');
end
else
memo1.Lines.Add(DoMain+'下的所有计算机如下:');
for i:=0 to List.Count-1 do
begin
memo1.Lines.Add(List.strings);
end;
finally
List.Destroy;
end;
end;
 
glbboy:
谢谢!
 
后退
顶部