具体用什么函数先知道ip,然后通过ip得到主机名
解决方案 »
- 如何通过MFC调用另一个程序
- 为什么D3D中CreateDevice之后浮点数计算出现很大误差
- 100分求广海注册邀请码
- CoCreateInstance 的问题
- CRecordset中GetFieldValue处理money类型?
- 帮我出主意,马上结贴
- 我想编程将桌面图象捕获后反转,未成功,请指教。
- 用CBitmapButton 类对Radio 和 Check Box 这两种按钮怎么无效?
- vc 父窗口调用子窗口函数
- 写了一个程序,到另外一个操作系统就用不了了,求大神
- 请教:怎么能用编程的方式控制delphi开发的DCOM服务程序的安全属性?
- MSSQL 出现“多行数据更新”问题,怎么解决?
拜托,大家以后想问这种问题,先看看这里有没有,省得我每次都重新写一遍,这是第N+1次回答了
(N>=6)下面的代码经过测试,希望对你有用,发现最近好像很多人都在问这个问题,好用就给我加分,枚举网络中的所有计算机(我拿CList测试一下,你可以拿别的测试)
需要指出的是还需要加入头文件
#include "Winsock2.h"
#include "afxtempl.h"
#include "Winnetwk.h"加入lib链接Project—》setting-》link-》object\libary modules 中
加入Ws2_32.lib Mpr.lib CList<CString,CString&> m_list;
m_list.RemoveAll(); CString strTemp;
struct hostent *host;
struct in_addr *ptr; // 获得IP地址
DWORD dwScope = RESOURCE_CONTEXT;
NETRESOURCE *NetResource = NULL;
HANDLE hEnum;
WNetOpenEnum( dwScope, NULL, NULL, NULL, &hEnum ); WSADATA wsaData;
//开始枚举网络资源
WSAStartup(MAKEWORD(1,1),&wsaData); if ( hEnum ) //如果句柄有效
{
DWORD Count = 0xFFFFFFFF;
DWORD BufferSize = 2048;
LPVOID Buffer = new char[2048];
// 调用WSAStartup后调用WNetEnumResource做进一步的枚举工作
WNetEnumResource( hEnum, &Count, Buffer, &BufferSize );
NetResource = (NETRESOURCE*)Buffer; char szHostName[200]; for ( unsigned int i = 0; i < BufferSize/sizeof(NETRESOURCE); i++, NetResource++ )
{
if ( NetResource->dwUsage == RESOURCEUSAGE_CONTAINER && NetResource->dwType == RESOURCETYPE_ANY ) {
if ( NetResource->lpRemoteName )
{
CString strFullName = NetResource->lpRemoteName;
if ( 0 == strFullName.Left(2).Compare("\\\\") ) strFullName = strFullName.Right(strFullName.GetLength()-2);
//获得主机名
gethostname( szHostName, strlen( szHostName ) );
//由主机名获得跟它对应的主机信息
host = gethostbyname(strFullName);
if(host == NULL) continue;
ptr = (struct in_addr *) host->h_addr_list[0];
// 提取IP地址信息,地址形式如下: 211.40.35.76
int a = ptr->S_un.S_un_b.s_b1; // 211
int b = ptr->S_un.S_un_b.s_b2; // 40
int c = ptr->S_un.S_un_b.s_b3; // 35
int d = ptr->S_un.S_un_b.s_b4; // 76 strTemp.Format("%s --> %d.%d.%d.%d",strFullName,a,b,c,d);
// 加入到链表中
m_list.AddTail(strTemp);
}
}
}
delete Buffer;
// 结束枚举工作
WNetCloseEnum( hEnum );
} // 卸载Winsock.dll
WSACleanup(); 列出本机IP地址和名字
CString m_strIPAddress;
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(0x02, 0x02), &wsaData);
if (iRet != 0)
{
TRACE("初始化winsock动态库出错!");
m_strIPAddress = "";
return;
} struct in_addr localaddr;
struct hostent *hp=NULL;
char hostname[50];
gethostname(hostname,49);//主机名 hp=gethostbyname(hostname);//主机信息
memcpy(&localaddr,hp->h_addr,hp->h_length);//地址 m_strIPAddress = inet_ntoa(localaddr);//变成char *
WSACleanup();
对了,我还有一个程序比这个算法快(用的是微软不公开的API函数),但是因为内容太多,你把邮箱地址提供一下,我给你发过去。如果对你有用,一定给我加分啊。刚才写的代码也有测试程序,你要也可以给你,记得知恩图报,给我加分就行了。我现在就想赚专家分:)
-------------------------------WNetEnumResource我早就用过了,我写的比你的要全
WNetEnumResource这个东西只可以获得网上邻居里面的的所有计算机,网络邻居也有看不到的主机,你怎么办?
我看只能一个一个ping,然后通过ip得到主机名,怎么通过ip得到主机名,gethostbyaddr也不知道可以不可以,先试一下在说
可能这样说是伤了大家的感情,但是这的确是事实。
检测一个255个主机地址的网段用不了10秒(考虑到启动线程的时间等其他消耗)。这个速度并不慢
1、并不是说开多少个线程的问题 (那是什么问题?)
2、建议多研究一下多线程的机制 多线程机制?什么机制?多线程不就是用于这种目的吗?
多线程就是为了尽量提高CPU和各种资源的利用率,在这里使用多线程是再恰当不过,不知道njtlxm(njtlxm)对此到底有什么异议.
这并不是一个可行的方法,如果我把ping服务(防火墙级别设成关闭ping服务)给关了,谁能给出更好的方法,是不是只能研究最底层网络服务了
其实楼上njtlxm(njtlxm) 说的方法应该可行的(结合snmp)
读取分析MIB库,看似好办法,但是同样存在问题:
一:并非所有设备都支持snmp。
二:读取分析MIB库工作量太大,需要大量的网络设备测试。