先谢再问,分数不多:)如何取得局域网的所有机器ip呢? 发送一个.255的ICMP广播包,所有本网段的机器都会回复给你 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 获得IP和主机名的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, &cEntries, 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;} 我从我的类中改写了一段,我也没调试,估计问题不大,如果有问题,在联系我。先取所有的网络的资源,再取主机的名字,在取IP./********************************************* * * Write by Databind 2001-05-17 * *********************************************/struct hostinfo{ char szHostName[255]; char szIp[17]; }; CList<CString,CString&> m_HostNameList; hostinfo * m_pHostInfos = NULL; WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); NETRESOURCE * pNetRC = NULL; Enumerate(pNetRC); int nMachine = m_HostNameList.GetCount(); m_pHostInfos = new hostinfo[nMachine]; memset(m_pHostInfos,0,sizeof(hostinfo)*nMachine); if(nMachine) { for(int i = 0;i < nMachine; i++) { CString csMachineName = m_HostNameList.GetAt(m_HostNameList.FindIndex(i)); memcpy(m_pHostInfos[i].szHostName, csMachineName, csMachineName.GetLength()); CString csIP = GetIPbyHostName(csMachineName); memcpy(m_pHostInfos[i].szIP, csIP, csIP.GetLength()); } }BOOL Enumerate(LPNETRESOURCE lpNetRC){ DWORD dwScope = RESOURCE_GLOBALNET ; DWORD dwType = RESOURCETYPE_ANY ; HANDLE hNet = 0; DWORD dwResult = WNetOpenEnum(dwScope,dwType,0,lpNetRC, &hNet) ; if( dwResult != NO_ERROR ) return FALSE; DWORD dwBuffer = 16*1024 ; // 16K is reasonable size DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries LPNETRESOURCE lpnrLocal = 0; BOOL bRet = TRUE; do { lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ; dwResult = WNetEnumResource(hNet,&dwEntries,lpnrLocal,&dwBuffer) ; if( dwResult == NO_ERROR ) { for( DWORD i = 0 ; i < dwEntries ; i++ ) { CString nsname; nsname = lpnrLocal[i].lpRemoteName; if(lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER) { nsname=nsname.Right(nsname.GetLength()-2); m_HostNameList.AddTail(nsname); } if( RESOURCEUSAGE_CONTAINER ==(lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) && lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER ) if( !Enumerate(&lpnrLocal[i])) return FALSE; } } else if( dwResult != ERROR_NO_MORE_ITEMS ) return FALSE; } while( dwResult != ERROR_NO_MORE_ITEMS ); if( lpnrLocal ) GlobalFree((HGLOBAL) lpnrLocal) ; WNetCloseEnum(hNet) ; return bRet;}CString GetIPbyHostName(CString csHostName){ if(csHostName == "") return ""; hostent *Me_Info; Me_Info=::gethostbyname(csHostName); DWORD a ; a = WSAGetLastError(); CString csIP; if(!Me_Info) return ""; csIP = ::inet_ntoa(*(struct in_addr*)Me_Info->h_addr_list[0]); return csIP;} 求用OnCtlColor函数实现图示功能代码 使用过WINIO库的帮忙看看 请求追求完美的大虾看看wraning的咚咚 请问!! 急急急~~解决的话,你要多少分我都给(<=me)!! 如何得到磁盘的文件系统是NTFS 还是FAT32 如何让MSXML生成的文件中每个XML语句都分行显示 请问在已经知道窗口句柄的情况下,如何判断一个窗口是 button,edit ? 在消息传递过程中,关于如何获取传递双方窗口句柄的一点小问题 如何察看项目依赖的头文件? 不知VC与C#两者怎样,现在是学习的话该选哪一门? 在网络连接状态下拔掉网线,这时如何最快地感知网络中断呢?
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, &cEntries, 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;
}
先取所有的网络的资源,再取主机的名字,在取IP.
/*********************************************
*
* Write by Databind 2001-05-17
*
*********************************************/struct hostinfo{
char szHostName[255];
char szIp[17];
};
CList<CString,CString&> m_HostNameList;
hostinfo * m_pHostInfos = NULL;
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
NETRESOURCE * pNetRC = NULL;
Enumerate(pNetRC);
int nMachine = m_HostNameList.GetCount();
m_pHostInfos = new hostinfo[nMachine];
memset(m_pHostInfos,0,sizeof(hostinfo)*nMachine);
if(nMachine)
{
for(int i = 0;i < nMachine; i++)
{
CString csMachineName = m_HostNameList.GetAt(m_HostNameList.FindIndex(i));
memcpy(m_pHostInfos[i].szHostName,
csMachineName,
csMachineName.GetLength());
CString csIP = GetIPbyHostName(csMachineName);
memcpy(m_pHostInfos[i].szIP,
csIP,
csIP.GetLength());
}
}
BOOL Enumerate(LPNETRESOURCE lpNetRC)
{
DWORD dwScope = RESOURCE_GLOBALNET ;
DWORD dwType = RESOURCETYPE_ANY ;
HANDLE hNet = 0;
DWORD dwResult = WNetOpenEnum(dwScope,dwType,0,lpNetRC, &hNet) ;
if( dwResult != NO_ERROR )
return FALSE;
DWORD dwBuffer = 16*1024 ; // 16K is reasonable size
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
LPNETRESOURCE lpnrLocal = 0;
BOOL bRet = TRUE;
do
{
lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ; dwResult = WNetEnumResource(hNet,&dwEntries,lpnrLocal,&dwBuffer) ; if( dwResult == NO_ERROR )
{
for( DWORD i = 0 ; i < dwEntries ; i++ )
{
CString nsname;
nsname = lpnrLocal[i].lpRemoteName;
if(lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
{
nsname=nsname.Right(nsname.GetLength()-2);
m_HostNameList.AddTail(nsname);
} if( RESOURCEUSAGE_CONTAINER ==(lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER) &&
lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER )
if( !Enumerate(&lpnrLocal[i]))
return FALSE;
}
}
else if( dwResult != ERROR_NO_MORE_ITEMS )
return FALSE;
} while( dwResult != ERROR_NO_MORE_ITEMS ); if( lpnrLocal )
GlobalFree((HGLOBAL) lpnrLocal) ;
WNetCloseEnum(hNet) ;
return bRet;}
CString GetIPbyHostName(CString csHostName)
{
if(csHostName == "")
return "";
hostent *Me_Info;
Me_Info=::gethostbyname(csHostName);
DWORD a ;
a = WSAGetLastError();
CString csIP;
if(!Me_Info)
return "";
csIP = ::inet_ntoa(*(struct in_addr*)Me_Info->h_addr_list[0]);
return csIP;
}