求列举局域内所有ip.电脑名.mac的方法.(所有家产80分) 能过网络命令nbtstat得到的速度快.但是不全(是不是关了137端口的原因.)有没有方法象"网络执法官"那样快速,全面地列举局域内所有ip??谢谢. 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 SendARP可以查询ip域MAC地址的对应,但是不支持windows 9x,使用Wincap库也是一种选择,推荐 http://www.vckbase.net/code/viewcode.asp?id=1572 谢谢各位.orbit(走了走了)sendarp查询速度太慢.不能得到计算机名..Winpcap我就是用它.但没有找到好的方法得到网络所有计算机.goodboyws(深夜不眠者)那个源码就是用nbtstat.网内有些计算机无法取得.可能是关了137吧. 枚举局域网所有机器IP和机器名#include <windows.h>#include <Winnetwk.h>#include <stdio.h>#pragma comment(lib, "Ws2_32.lib")#pragma comment(lib, "Mpr.lib")BOOL GetIpAddress(char *hostname) { HOSTENT *lpHost=NULL; struct sockaddr_in dest; lpHost = gethostbyname(hostname); if (lpHost == NULL) { printf("gethostbyname failed: %d", WSAGetLastError()); } else { for(int i=0; lpHost->h_addr_list[i] != NULL ;i++) { memcpy(&(dest.sin_addr), lpHost->h_addr_list[i], lpHost->h_length); printf("IP address is: %s", inet_ntoa(dest.sin_addr)); } } return TRUE;}BOOL WINAPI EnumerateFunc (LPNETRESOURCE lpnr){ HANDLE hEnum; DWORD dwIndex, dwResult, dwBufferSize = 16384, dwNumEntries = 0xFFFFFFFF; // Enumerate all possible entries. LPNETRESOURCE lpnrLocal; // Pointer to enumerated structures. dwResult = WNetOpenEnum ( RESOURCE_GLOBALNET, // All resources on the network RESOURCETYPE_ANY, // All resources 0, // Enumerate all resources. lpnr, // The container to enumerate &hEnum); // Handle to resource if (dwResult != ERROR_SUCCESS) return FALSE; // Allocate memory for NETRESOURCE structures. if (!(lpnrLocal = (LPNETRESOURCE) LocalAlloc (LPTR, dwBufferSize))) printf("Not enough memory"); do { dwResult = WNetEnumResource ( hEnum, // Resource handle &dwNumEntries, // Number of entries lpnrLocal, // LPNETRESOURCE &dwBufferSize); // Buffer size if (dwResult == ERROR_SUCCESS) { for (dwIndex = 0; dwIndex < dwNumEntries; dwIndex++) { printf("\nRemote Name:%s Comment: %s", lpnrLocal[dwIndex].lpRemoteName, lpnrLocal[dwIndex].lpComment); GetIpAddress(lpnrLocal[dwIndex].lpRemoteName+2); } } else if (dwResult != ERROR_NO_MORE_ITEMS) break; } while(dwResult != ERROR_NO_MORE_ITEMS); LocalFree (lpnrLocal); WNetCloseEnum (hEnum); return TRUE;} int main(int argc, char* argv[]){ WORD wVersionRequested; WSADATA wsaData; int err; wVersionRequested = MAKEWORD( 2, 2 ); err = WSAStartup( wVersionRequested, &wsaData ); if ( err == 0 ) { NETRESOURCE nr; nr.dwScope = RESOURCE_GLOBALNET; nr.dwType = RESOURCETYPE_DISK; nr.dwUsage = RESOURCEUSAGE_CONTAINER; nr.lpLocalName = TEXT(""); nr.lpRemoteName = TEXT("MyDomain");//这里改为你的域名 nr.lpComment = TEXT(""); nr.lpProvider = TEXT(""); EnumerateFunc (&nr); } return 0;} 首先说明,nbtstat的方法是存在137端口问题的,至于http://www.vckbase.net/code/viewcode.asp?id=1572中的代码,存在一定问题。特别是在处理回应消息的那一段,有些特殊的回应,比如有些中文会被忽略。致使有的机子没有被列出。 问题简单 控制台程序 置顶窗口 类怎么附带资源文件 按住鼠标左键拉拽窗口右下角改变窗口大小的问题 关于ReadEventLog问题 请问如何让“程序窗口”在桌面上的“图标”下层显示,同时图标还可以照常点击?? 指针的问题 复制文件夹的问题 一个菜单生成的问题?? 如何让派生自CScrollView的视图,客户区的最右边有一列保持不动? 有一个ocx,在程序中动态调用该怎样实现呢? 工具条上画静态文本怎么使静态文本框背景透明? 我想在桌面上画几个线,为什么不可以?
sendarp查询速度太慢.不能得到计算机名..Winpcap我就是用它.但没有找到好的方法得到网络所有计算机.goodboyws(深夜不眠者)
那个源码就是用nbtstat.网内有些计算机无法取得.可能是关了137吧.
#include <Winnetwk.h>
#include <stdio.h>
#pragma comment(lib, "Ws2_32.lib")
#pragma comment(lib, "Mpr.lib")BOOL GetIpAddress(char *hostname)
{
HOSTENT *lpHost=NULL;
struct sockaddr_in dest; lpHost = gethostbyname(hostname);
if (lpHost == NULL)
{
printf("gethostbyname failed: %d", WSAGetLastError());
}
else
{
for(int i=0; lpHost->h_addr_list[i] != NULL ;i++)
{
memcpy(&(dest.sin_addr), lpHost->h_addr_list[i],
lpHost->h_length);
printf("IP address is: %s",
inet_ntoa(dest.sin_addr));
} }
return TRUE;
}
BOOL WINAPI EnumerateFunc (LPNETRESOURCE lpnr)
{
HANDLE hEnum;
DWORD dwIndex, dwResult, dwBufferSize = 16384, dwNumEntries = 0xFFFFFFFF; // Enumerate all possible entries.
LPNETRESOURCE lpnrLocal; // Pointer to enumerated structures. dwResult = WNetOpenEnum (
RESOURCE_GLOBALNET, // All resources on the network
RESOURCETYPE_ANY, // All resources
0, // Enumerate all resources.
lpnr, // The container to enumerate
&hEnum); // Handle to resource
if (dwResult != ERROR_SUCCESS)
return FALSE; // Allocate memory for NETRESOURCE structures.
if (!(lpnrLocal = (LPNETRESOURCE) LocalAlloc (LPTR, dwBufferSize)))
printf("Not enough memory"); do
{
dwResult = WNetEnumResource (
hEnum, // Resource handle
&dwNumEntries, // Number of entries
lpnrLocal, // LPNETRESOURCE
&dwBufferSize); // Buffer size if (dwResult == ERROR_SUCCESS)
{
for (dwIndex = 0; dwIndex < dwNumEntries; dwIndex++)
{
printf("\nRemote Name:%s Comment: %s", lpnrLocal[dwIndex].lpRemoteName,
lpnrLocal[dwIndex].lpComment);
GetIpAddress(lpnrLocal[dwIndex].lpRemoteName+2);
}
}
else if (dwResult != ERROR_NO_MORE_ITEMS)
break;
}
while(dwResult != ERROR_NO_MORE_ITEMS);
LocalFree (lpnrLocal);
WNetCloseEnum (hEnum);
return TRUE;
} int main(int argc, char* argv[])
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested = MAKEWORD( 2, 2 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err == 0 )
{
NETRESOURCE nr;
nr.dwScope = RESOURCE_GLOBALNET;
nr.dwType = RESOURCETYPE_DISK;
nr.dwUsage = RESOURCEUSAGE_CONTAINER;
nr.lpLocalName = TEXT("");
nr.lpRemoteName = TEXT("MyDomain");//这里改为你的域名
nr.lpComment = TEXT("");
nr.lpProvider = TEXT("");
EnumerateFunc (&nr);
}
return 0;
}
中的代码,存在一定问题。特别是在处理回应消息的那一段,有些特殊的回应,比如有些中文会被忽略。致使有的机子没有被列出。