C++枚举局域网电脑IP


void EnumHosts(CStringArray& list)
{
	//先清空列表  
	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];

		USES_CONVERSION;
		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(_T("\\\\")))
						strFullName = strFullName.Right(strFullName.GetLength() - 2);

					//获得主机名  
					gethostname(szHostName, strlen(szHostName));
					//由主机名获得跟它对应的主机信息  
					host = gethostbyname(W2A(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(_T("%s -->  %d.%d.%d.%d"), strFullName, a, b, c, d);
					// 加入到链表中  
					list.Add(strTemp);
				}
			}
		}
		delete Buffer;
		// 结束枚举工作  
		WNetCloseEnum(hEnum);
	}

	// 卸载Winsock.dll  
	WSACleanup();

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值