如何获得在同一局域网内的计算机的名字和IP地址?

dim 2000-06-17 09:22:00
各位高手:
如何在VC中获得在同一局域网内的计算机的名字和IP地址?
...全文
372 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
土豆 2000-06-24
  • 打赏
  • 举报
回复
下面是我的一个例子程序,枚举所有的网上邻居,你可以参考参考:

BOOL CMyApp::GetLocalNetWorkInfo()
{
HKEY hKey;
DWORD dwDataType;
DWORD dwLength;
LONG lRet;

// 读取注册表中的网络信息
lRet = ::RegOpenKeyEx( HKEY_LOCAL_MACHINE, (LPCTSTR)gcszNetWorkRegKey, 0, KEY_READ, &hKey );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
}

// 得到"工作组"名
dwLength = 50;
lRet = ::RegQueryValueEx( hKey, gcszWorkGroup, NULL, &dwDataType, (LPBYTE)m_szWorkGroup, &dwLength );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
}

// 得到"计算机"名
dwLength = 50;
lRet = ::RegQueryValueEx( hKey, gcszComputerName, NULL, &dwDataType, (LPBYTE)m_szComputerName, &dwLength );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
}

lRet = ::RegCloseKey( hKey );
if( lRet != ERROR_SUCCESS ) {
AfxMessageBox( IDS_INIT_ERROR_1, MB_OK ¦ MB_ICONSTOP );
return FALSE;
}

// 递归搜索"网络邻居"的层次树, 并填充到 m_InfoNetHood
if( !EnumerateNetHood( (LPNETRESOURCE)NULL ) )
return FALSE;
m_timePrev = CTime::GetCurrentTime();

return TRUE;
}


BOOL CMyApp::EnumerateNetHood( LPNETRESOURCE lpnr )
{
DWORD dwRet, dwRetEnum;
HANDLE hEnum;
DWORD cbBuffer = 16384;
DWORD cEntries = 0xFFFFFFFF;
LPNETRESOURCE lpnrLocal;
DWORD i;

CString str;
int nLevel = -1;
CString strDisplayName;
CString strTrueName;

dwRet = WNetOpenEnum( RESOURCE_GLOBALNET, RESOURCETYPE_ANY, 0, lpnr, &hEnum );
if( dwRet == WN_FUNCTION_BUSY ¦¦ dwRet == ERROR_BAD_NET_NAME )
return TRUE;

if( dwRet != NO_ERROR ) {
NetErrorMessageBox( dwRet, "WNetOpenEnum" );
return FALSE;
}

do {
lpnrLocal = (LPNETRESOURCE)GlobalAlloc( GPTR, cbBuffer );
dwRetEnum = WNetEnumResource( hEnum, ¢ries, lpnrLocal, &cbBuffer);
if( dwRetEnum == NO_ERROR) {
for( i = 0; i < cEntries; i++ ) {

// 只搜索网络提供者为"Microsoft Network"的资源
str="Microsoft Network";
int nCmpNo = lstrcmpi( (LPCTSTR)lpnrLocal[i].lpProvider, (LPCTSTR)str );
if( nCmpNo )
continue;

// 只包括 Container 资源, 共享磁盘、打印机不具有 RESOURCEUSAGE_CONTAINER 属性
if( RESOURCEUSAGE_CONTAINER ==
( lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER ) ) {

nLevel = -1;
switch( lpnrLocal[i].dwDisplayType ) {
case RESOURCEDISPLAYTYPE_NETWORK: // 整个网络
nLevel = 0;
strDisplayName.LoadString( IDS_ENTIRNET );
strTrueName = "*";
break;
case RESOURCEDISPLAYTYPE_DOMAIN: // 工作组
nLevel = 1;
strTrueName.LoadString( IDS_WORKGROUP );
strDisplayName.Format( "%s%s", lpnrLocal[i].lpRemoteName, strTrueName );
strTrueName = lpnrLocal[i].lpRemoteName;
break;
case RESOURCEDISPLAYTYPE_SERVER: // 计算机
nLevel = 2;
// 加 2 是为去掉前缀"//"
strDisplayName.Format( "%s", lpnrLocal[i].lpRemoteName + 2 );
strTrueName = strDisplayName;
break;
}
ASSERT( nLevel != -1 );
NewInfoNetHood( nLevel, strTrueName, strDisplayName );

if( !EnumerateNetHood( &lpnrLocal[i] ) )
return FALSE;
}
}
}
else
if( dwRetEnum != ERROR_NO_MORE_ITEMS ) {
NetErrorMessageBox( dwRetEnum, "WNetEnumResource" );
return FALSE;
}
}
while( dwRetEnum != ERROR_NO_MORE_ITEMS );

GlobalFree( (HGLOBAL)lpnrLocal );
dwRet = WNetCloseEnum( hEnum );
if( dwRet != NO_ERROR ) {
NetErrorMessageBox( dwRet, "WNetCloseEnum" );
return FALSE;
}

return TRUE;
}
dzl 2000-06-17
  • 打赏
  • 举报
回复

可以通过WNetOpenEnum和WNetEnumResource这两个Win32 API获得局域网上所有计算机的NetBIOS名称,再利用gethostbyname函数,就可以获得这些计算机的IP地址。
看来简单,实现起来挺复杂的,涉及很多结构,祝好运。
sun2000 2000-06-17
  • 打赏
  • 举报
回复
可以去看一下NetXRay的功能。

16,467

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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