如何枚举网络邻居.....

defendmidfield 2004-08-24 09:25:13
查了一下,好像是用WNetOpenEnum()相关的函数,网上也有代码

但是我编译后显示的是上一层,譬如workgroup,ms这种工作组,奇怪。。

codeguru的那段代码我也找不到了,有人有没,请发给窝参考,谢谢
...全文
103 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
zhoujiamurong 2004-10-10
  • 打赏
  • 举报
回复
mark
oyljerry 2004-08-24
  • 打赏
  • 举报
回复
我用::NetServerEnum就可以查找所有的网上邻居中的主机啊
DentistryDoctor 2004-08-24
  • 打赏
  • 举报
回复
CHostSearch::ErrorHandler错误处理
CHostSearch::DisplayStruct处理查找到的结果(l.dwDisplayType==RESOURCEDISPLAYTYPE_SERVER为主机)
CHostSearch::EnumerateResources查找
DentistryDoctor 2004-08-24
  • 打赏
  • 举报
回复
void CHostSearch::ErrorHandler(DWORD errorNum, char *s)
{
DWORD result, error;
char errorString[1000];
char name[1000];

if (errorNum != ERROR_EXTENDED_ERROR)
SaveMsg("Error number:%d return by %s",errorNum,s);
// If its an extended error, get the error.
else
{
result = WNetGetLastError(&error,errorString, 1000, name, 1000);
if (result != NO_ERROR)
SaveMsg("Failure in WNetGetLastError: %d",result);
else
SaveMsg("Extended Error: %s .Provider:%s",errorString,name);
}
}

void CHostSearch::DisplayStruct(NETRESOURCE l)
{
if(l.dwDisplayType==RESOURCEDISPLAYTYPE_SERVER)
{
char szText[256];
char szItem[256];
sprintf(szText,"%s",l.lpRemoteName);
for(UINT i=2;i<strlen(szText);i++)
szItem[i-2] = szText[i];
szItem[i-2] = 0;
char szHostName[256];
gethostname(szHostName,256);
if(_stricmp(szHostName,szItem))
{
// MACHINE machine;
// machine.szMachineName = szItem;
// machine.szRemoteName = szText;
// g_ListMachine.push_back(machine);
WNetCancelConnection2(l.lpRemoteName,0,0);
CString szUserName = theApp.GetProfileString("RemotePlay","UserName",_T("Administrator"));
CString szPassword = theApp.GetProfileString("RemotePlay","Password",_T(""));
if(NO_ERROR!=WNetAddConnection2(&l,szPassword,szUserName,CONNECT_INTERACTIVE))
ShowLastError;
else
{
LPHOSTENT lpHostEnt = NULL;
LPSTR szIPAddr = "127.127.127.127";
//Resolve IP Address
lpHostEnt = gethostbyname(szItem);
if(lpHostEnt)
{
szIPAddr = inet_ntoa(*reinterpret_cast<LPIN_ADDR>(lpHostEnt->h_addr_list[0]));
AddHost(szItem,szIPAddr);
}
}
}
}
}

BOOL CHostSearch::EnumerateResources(LPNETRESOURCE startingPoint)
{
DWORD result, resultEnum;
HANDLE enumHandle;
LPNETRESOURCE buffer;
DWORD bufferSize = 16384;
DWORD numEntries = 0xFFFFFFFF;
DWORD i;

// Open a container
result = WNetOpenEnum(RESOURCE_GLOBALNET,RESOURCETYPE_ANY, 0, startingPoint,&enumHandle);

if (result != NO_ERROR)
{
ErrorHandler( result, "WNetOpenEnum");
return FALSE;
}

// allocate a buffer to hold resources
buffer = (LPNETRESOURCE) GlobalAlloc(GPTR,bufferSize);

do
{
bufferSize = 16384;
numEntries = 0xFFFFFFFF;

resultEnum = WNetEnumResource(enumHandle,
&numEntries, buffer, &bufferSize);
if (resultEnum == NO_ERROR)
{
for(i = 0; i < numEntries; i++)
{
DisplayStruct( buffer[i]);
if((buffer[i].dwUsage & RESOURCEUSAGE_CONTAINER)&&
(buffer[i].dwDisplayType==6 ||buffer[i].dwDisplayType==RESOURCEDISPLAYTYPE_DOMAIN))
{
if (!EnumerateResources(&buffer[i]))
SaveMsg("Enumeration failed.");
}
}
}
else if (resultEnum != ERROR_NO_MORE_ITEMS)
{
ErrorHandler(resultEnum,"WNetEnumResource");
break;
}
}
while(resultEnum != ERROR_NO_MORE_ITEMS);

// Clean up
GlobalFree((HGLOBAL) buffer);
result = WNetCloseEnum(enumHandle);
if (result != NO_ERROR)
{
ErrorHandler(result, "WNetCloseEnum");
return FALSE;
}
return TRUE;

}

CHostSearch::EnumerateResources(NULL);开始查找。
defendmidfield 2004-08-24
  • 打赏
  • 举报
回复
搞定
给分
感谢
DentistryDoctor 2004-08-24
  • 打赏
  • 举报
回复
gethostbyname
defendmidfield 2004-08-24
  • 打赏
  • 举报
回复

谢谢楼上两位,懂了

还有一个问题,怎么一直机器name而去获取机器的ip地址?是不是哪个get..by..函数就搞定?刚才没有查到..

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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