如何获得局域网内的所有的计算机名,在不知道IP,域等等的情怳下?解决后高分奉送!

yhxc 2002-12-17 11:01:40
局域网是以工作组来分的,没有用域,要能在任何一个局域网中通用才行。假设计算机都是连接的
...全文
430 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
yhxc 2003-01-07
  • 打赏
  • 举报
回复
结贴了,:)
warton 2002-12-25
  • 打赏
  • 举报
回复
to NowCan
你给我的,我收到,谢谢!!
warton 2002-12-25
  • 打赏
  • 举报
回复
转木头兄的:局域网的域名和域用户计算机的函数,:)

typedef struct
{
unsigned dwScope;
unsigned dwType;
unsigned dwDisplayType;
unsigned dwUsage;
String LocalName;
String RemoteName;
String Comment;
String Provider;
}TDomain;

void check(DWORD res)
{
if (res)
throw Exception(SysErrorMessage(res));
}

void GetDomain(TStrings *List)
{
TList *DomainList = new TList;
List->BeginUpdate();
try
{
List->Clear();
unsigned long bufsize = 8192;
void *buffer = new BYTE[bufsize];
try
{
HANDLE lphEnum = NULL;
check(WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, NULL, &lphEnum));
unsigned long Count = 0xFFFFFFFF;
int res = WNetEnumResource(lphEnum, &Count, buffer, &bufsize);
if (ERROR_NO_MORE_ITEMS == res) return;
check(res);

TNetResource *p = (TNetResource*)buffer;
for (unsigned i = 0; i < Count; ++i)
{
TDomain *domain = (TDomain*)new BYTE[sizeof(TDomain)];
domain->dwScope = p->dwScope;
domain->dwType = p->dwType;
domain->dwDisplayType = p->dwDisplayType;
domain->dwUsage = p->dwUsage;
domain->LocalName = p->lpLocalName;
domain->RemoteName = p->lpRemoteName;
domain->Comment = p->lpComment;
domain->Provider = p->lpProvider;
DomainList->Add(domain);
++p;
}
check(WNetCloseEnum(lphEnum));

for (int i = 0; i < DomainList->Count; ++i)
{
TNetResource *p = (TNetResource*)DomainList->Items[i];
check(WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, p, &lphEnum));
for(;;)
{
Count = 0xFFFFFFFF;
res = WNetEnumResource(lphEnum, &Count, buffer, &bufsize);
if (ERROR_NO_MORE_ITEMS == res) break;
check(res);
TNetResource *Resource = (TNetResource*)buffer;
for (unsigned j = 0; j < Count; ++j)
{
List->Add(Resource->lpRemoteName);
++Resource;
}
}
check(WNetCloseEnum(lphEnum));
}
}
__finally
{
free(buffer);
}
}
__finally
{
List->EndUpdate();
for (int i = 0; i < DomainList->Count; ++i)
free(DomainList->Items[i]);
delete DomainList;
}
}

void GetDomainUser(const String domain, TStrings *List)
{
List->BeginUpdate();
try
{
List->Clear();
unsigned long bufsize = 8192;
void *buffer = new BYTE[bufsize];
try
{
HANDLE lphEnum;
TNetResource Resource;
memset(&Resource, 0, sizeof(Resource));
Resource.lpRemoteName = domain.c_str();
Resource.dwDisplayType = RESOURCEDISPLAYTYPE_SERVER;
Resource.dwUsage = RESOURCEUSAGE_CONTAINER;
Resource.dwScope = RESOURCETYPE_DISK;
check(WNetOpenEnum(RESOURCE_GLOBALNET, RESOURCETYPE_DISK,
RESOURCEUSAGE_CONTAINER, &Resource, &lphEnum));
for (;;)
{
unsigned long Count = 0xFFFFFFFF;
int res = WNetEnumResource(lphEnum, &Count, buffer, &bufsize);
if (ERROR_NO_MORE_ITEMS == res) return;
check(res);
TNetResource *p = (TNetResource*)buffer;
for (unsigned i = 0; i < Count; ++i)
{
List->Add(p->lpRemoteName + 2);
++p;
}
}
check(WNetCloseEnum(lphEnum));
}
__finally
{
delete []buffer;
}
}
__finally
{
List->EndUpdate();
}
}

void __fastcall TForm1::FormCreate(TObject *Sender)
{
GetDomain(ListBox1->Items);
}

void __fastcall TForm1::ListBox1Click(TObject *Sender)
{
String domain = ListBox1->Items->Strings[ListBox1->ItemIndex];
GetDomainUser(domain, ListBox2->Items);
}

gudufeixiang 2002-12-24
  • 打赏
  • 举报
回复
m
yuyulily 2002-12-24
  • 打赏
  • 举报
回复
我试了一下invalid老大的代码,不慢啊。
warton 2002-12-24
  • 打赏
  • 举报
回复
nowcan兄,给我一份吧!!
warton 2002-12-24
  • 打赏
  • 举报
回复
不错不错,收藏!!
NowCan 2002-12-24
  • 打赏
  • 举报
回复
我有一份源代码,速度还可以,但是我看不太懂,是VC的。你要的话。给我发邮件注明需要《网上邻居代码》
nowcan@163.com
nowcan@21cn.com
这两个地址都发吧。
yhxc 2002-12-24
  • 打赏
  • 举报
回复
怎么发UDP呀,这个你实现了吗?请速回,我要结贴了!
Lonemoon 2002-12-24
  • 打赏
  • 举报
回复
留着以后看
NowCan 2002-12-24
  • 打赏
  • 举报
回复
那段代码对于每个工作组都有主机的网络是很快,但是遇到我们这里的情况就会在那些空的工作组的地方等待很久。(不知道怎么回事,我们这里经常出现空的工作组。)
smilingchen 2002-12-24
  • 打赏
  • 举报
回复
mark
invalid 2002-12-17
  • 打赏
  • 举报
回复

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <System.hpp>
#include <classes.hpp>
#include <winnetwk.h>
#include <winsock.h>
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{

}

//---------------------------------------------------------------------------
//获取网上邻居的列表,存储在串表中
bool EnumNetResource(TStrings *rcList,LPNETRESOURCE lpNR, DWORD dwScope,DWORD dwType)
{
HANDLE hEnum = 0;
DWORD dwResult = WNetOpenEnum(
dwScope, // scope of enumeration
dwType, // resource types to list
0, // enumerate all resources
lpNR, // pointer to resource structure (NULL at first time)
& hEnum // handle to resource
) ;
if( dwResult != NO_ERROR ) return false;
bool bRet=true;
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
NETRESOURCE NR[1024];
DWORD dwBuffer=1024*sizeof(NETRESOURCE);
while(1)
{
dwResult = WNetEnumResource( hEnum, // resource-handle
&dwEntries,
(LPVOID)NR,
&dwBuffer
);
if (dwResult == ERROR_NO_MORE_ITEMS)
break;
else if(dwResult!=NO_ERROR)
{
bRet=false;
break;
}
for (DWORD i = 0; i < dwEntries; i++)
{
if(NR[i].dwDisplayType==RESOURCEDISPLAYTYPE_SERVER)
{
char *p=NR[i].lpRemoteName;
// while(*p=='\\') p++;
if(*p)
rcList->Add(p);
}
else if((NR[i].dwUsage& RESOURCEUSAGE_CONTAINER)==RESOURCEUSAGE_CONTAINER)
{
bRet=EnumNetResource(rcList,& NR[i],dwScope,dwType);
if(bRet==false)
break;
}
}
if(bRet==false)
break;
}
//End While(1)
WNetCloseEnum(hEnum);
return bRet;
}

//------获取某主机的IP地址,如果主机名为空,则返回本机的名和IP地址---------
AnsiString gethostip(AnsiString & host)
{
WSADATA wsaData;
AnsiString IP;
int pos=0;
char temp[255];
strcpy(temp,host.c_str());
while(temp[pos++]=='\\');
pos--;
WSAStartup(MAKEWORD(2,0),& wsaData);
if (host.IsEmpty())
{
char hostname[128];
if(gethostname(hostname,128)!=0)
return AnsiString("");
host=hostname;
}
try
{
struct hostent *hp=gethostbyname(temp+pos);//host.c_str());
if (hp== NULL)
{
IP="";
}
else
IP=inet_ntoa(*(struct in_addr*)hp->h_addr_list[0]);
}
catch(...)
{
IP="";
}
WSACleanup();
return IP;
}

void __fastcall TForm1::Button1Click(TObject *Sender)
{
ListBox1->Clear();
SB->SimpleText = "正在工作...";
Screen->Cursor=crHourGlass;
EnumNetResource(ListBox1->Items,NULL,RESOURCE_GLOBALNET,RESOURCETYPE_ANY);
Screen->Cursor=crDefault;
SB->SimpleText = "";
}


//---------------------------------------------------------------------------
void __fastcall TForm1::Button2Click(TObject *Sender)
{
if(ListBox1->ItemIndex==-1)
return;
Screen->Cursor=crHourGlass;
String Host = ListBox1->Items->Strings[ListBox1->ItemIndex];
AnsiString IP=gethostip(Host);
Screen->Cursor=crDefault;
Edit1->Text=IP;
if(IP.IsEmpty())
MessageBox(Handle,"无法与主机联系!","提示",MB_ICONINFORMATION|MB_OK|MB_SETFOREGROUND);
}
NowCan 2002-12-17
  • 打赏
  • 举报
回复
不好意思,没看清。
慢,看来是不好办了。
可以向137端口发一个广播UDP,看看回应。
NowCan 2002-12-17
  • 打赏
  • 举报
回复
主要是慢在了解析IP上。如果没有必要不要加这个功能。
另,我主页上刚刚放了一个程序,你帮我试试看,我还没有试过呢。
http://nowcan.yeah.net
invalid 2002-12-17
  • 打赏
  • 举报
回复
我运行成功了,慢要采用别的方式。问问nowcan吧。
yhxc 2002-12-17
  • 打赏
  • 举报
回复
非常感谢,但特慢,没运行成功!能怎么让它快点吗?

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧