PDA

View Full Version : چگونگی تشخیص کامپیوترها یا IP های متصل به شبکه



nilufari
جمعه 09 اردیبهشت 1384, 22:05 عصر
سلام ...
من از 2 ماه پیش در حال تکمیل یک پروژه هستم و مراحل پایانی اونو طی میکنم . فقط یک مشکل مانده و آن اینست :

میخوام شماره IP یا حداقل نام کامپیوترهای موجود در یک دومین یا در یک رنج IP بدست بیارم تا کاربر بتونه از بین اونا سرورو انتخاب کنه

البته اگه بتونم IP سرور شبکه رو مستقیما با کد نویسی پیدا کنم که دیگه نور علی نوره .. لطفا راهنمایی بفرمایید .... :oops:

Touska
شنبه 10 اردیبهشت 1384, 09:44 صبح
اگر به یک وسیله ایی به سرور دسترسی داشته باشید می توانید با Tcp آدرس IP آن را گیر بیا ورید.

موفق باشید :flower:

m-khorsandi
شنبه 10 اردیبهشت 1384, 10:30 صبح
درود
با این Source میتونی لیست کامپیوترهای متصل به شبکه رو بدست بیاری:




type
PNetResourceArray = ^TNetResourceArray;
TNetResourceArray = array[0..100] of TNetResource;

function CreateNetResourceList(ResourceType: DWord;
NetResource: PNetResource;
out Entries: DWord;
out List: PNetResourceArray): Boolean;
var
EnumHandle: THandle;
BufSize: DWord;
Res: DWord;
begin
Result := False;
List := Nil;
Entries := 0;
if WNetOpenEnum(RESOURCE_GLOBALNET,
ResourceType,
0,
NetResource,
EnumHandle) = NO_ERROR then begin
try
BufSize := $4000; // 16 kByte
GetMem(List, BufSize);
try
repeat
Entries := DWord(-1);
FillChar(List^, BufSize, 0);
Res := WNetEnumResource(EnumHandle, Entries, List, BufSize);
if Res = ERROR_MORE_DATA then
begin
ReAllocMem(List, BufSize);
end;
until Res <> ERROR_MORE_DATA;

Result := Res = NO_ERROR;
if not Result then
begin
FreeMem(List);
List := Nil;
Entries := 0;
end;
except
FreeMem(List);
raise;
end;
finally
WNetCloseEnum(EnumHandle);
end;
end;
end;

procedure ScanNetworkResources(ResourceType, DisplayType: DWord; List: TStrings);

procedure ScanLevel(NetResource: PNetResource);
var
Entries: DWord;
NetResourceList: PNetResourceArray;
i: Integer;
begin
if CreateNetResourceList(ResourceType, NetResource, Entries, NetResourceList) then try
for i := 0 to Integer(Entries) - 1 do
begin
if (DisplayType = RESOURCEDISPLAYTYPE_GENERIC) or
(NetResourceList[i].dwDisplayType = DisplayType) then begin
List.AddObject(NetResourceList[i].lpRemoteName,
Pointer(NetResourceList[i].dwDisplayType));
end;
if (NetResourceList[i].dwUsage and RESOURCEUSAGE_CONTAINER) <> 0 then
ScanLevel(@NetResourceList[i]);
end;
finally
FreeMem(NetResourceList);
end;
end;

begin
ScanLevel(Nil);
end;


اینجوری هم فراخوانی میشه:


procedure TForm1.Button1Click(Sender: TObject);
begin
ScanNetworkResources(RESOURCETYPE_DISK, RESOURCEDISPLAYTYPE_SERVER, ListBox1.Items);
end;

Gladiator
شنبه 10 اردیبهشت 1384, 10:31 صبح
you can use TidIcmp to send echo messages to your target machine

sorry for farsi less

nilufari
شنبه 10 اردیبهشت 1384, 23:24 عصر
متشکر از پاسخهای شما .... اما بهترین کد رو من پیدا کردم و اونم اینه (شاید بدردتون بخوره) :


procedure Tserver_setup.BitBtn3Click(Sender: TObject);
var
WSAData : TWSAData;
HostEnt : PHostEnt;
name, address: string;
begin
WSAStartup(2, WSAData);
SetLength(Name, 255);
GetHostName(Pchar(name), 255);
Edit2.Text:= ShowServerDialog(PasswordDlg.Handle);
name:=copy(Edit2.Text,3,Length(Edit2.Text)-2);

SetLength(Name, StrLen(Pchar(Name)));

HostEnt:= gethostbyname(pchar(name));
With HostEnt^ do
Address:=Format('%d.%d.%d.%d', [Byte(h_addr^[0]), Byte(h_addr^[1]), Byte(h_addr^[2]),Byte(h_addr^[3])]);
WSACleanup;

Edit1.Text:=address;

end;

m-khorsandi
یک شنبه 11 اردیبهشت 1384, 11:10 صبح
آقا چه Unit هایی رو Use کردی؟

nilufari
یک شنبه 11 اردیبهشت 1384, 11:56 صبح
فقط یونیت WinSock
یعنی Uses WinSock