在一个局域网中我怎样才能得到别人的网卡地址呢,还有 NETRESOURCE 结构体是一个什么样的东西,相应的函数又怎样用WNetOpenEnum() WNetEnumResource(),
这些东西我在MSDN里都找不到,请各位帮忙。
这些东西我在MSDN里都找不到,请各位帮忙。
解决方案 »
- 怎样用GPIB控制功率计?
- 能否向消息响应函数传递控件的ID
- USB-RS232形成的COM口无法使用CSerialPort类
- 查询数据时返回值的问题?
- 请教网络高手一下gethostbyname
- 通过DLL文件或者LIB文件,我如何能够得到一个动态库中所有的函数的完整定义,包括函数名,输出参数类型,输入参数类型等
- Win32程序子窗口如何子类化?(不用MFC)
- 注册表问题,在DELPHI没解决,特来邀请VC高手帮忙~!先奉上100分,不够可以再加;解决者也请到DELPHI版回帖,我将一起结算
- ADO连接
- 怎么给标题加上序号?
- 如何在程序运行时获得该程序的可执行文件的路径?请指教
- 1000分求助,两个猫之间传递数据的原代码,兄弟门非常急求求你们了老板要炒掉我了
DWORD WNetOpenEnum(
DWORD dwScope,
DWORD dwType,
DWORD dwUsage,
LPNETRESOURCE lpNetResource,
LPHANDLE lphEnum
);
可以上微软网站下载
Include nb30.h and link with netapi32.lib. This article is based on Q118623.
Source
typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff[30];
} ASTAT, * PASTAT;
CString GetMacAddress(CString sNetBiosName)
{
ASTAT Adapter;
NCB ncb;
UCHAR uRetCode;
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = 0;
uRetCode = Netbios(&ncb);
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = 0;
sNetBiosName.MakeUpper();
FillMemory(ncb.ncb_callname, NCBNAMSZ - 1, 0x20);
strcpy((char *)ncb.ncb_callname, (LPCTSTR) sNetBiosName);
ncb.ncb_callname[sNetBiosName.GetLength()] = 0x20;
ncb.ncb_callname[NCBNAMSZ] = 0x0;
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios(&ncb);
CString sMacAddress;
if (uRetCode == 0)
{
sMacAddress.Format(_T("%02x%02x%02x%02x%02x%02x"),
Adapter.adapt.adapter_address[0],
Adapter.adapt.adapter_address[1],
Adapter.adapt.adapter_address[2],
Adapter.adapt.adapter_address[3],
Adapter.adapt.adapter_address[4],
Adapter.adapt.adapter_address[5]);
}
return sMacAddress;
}
{
DWORD dwRet = 0;
HANDLE hEnum;
DWORD dwBuffer = 16384 ; // 16K is reasonable size
DWORD dwEntries = 0xFFFFFFFF ; // enumerate all possible entries
LPNETRESOURCE lpnrLocal = 0; DWORD dwScope = RESOURCE_GLOBALNET ;
if( dwFlags_p & 2 )
dwScope = RESOURCE_CONNECTED ;
else if( dwFlags_p & 4 )
dwScope = RESOURCE_REMEMBERED ;
// else GLOBALNET ... DWORD dwType = RESOURCETYPE_ANY ;
if( dwFlags_p & 16 )
dwType = RESOURCETYPE_DISK ;
else if( dwFlags_p & 32 )
dwType = RESOURCETYPE_PRINT ;
// else TYPE_ANY ... dwRet = WNetOpenEnum(dwScope, dwType, 0, lpNetRC, &hEnum);
if(dwRet != NO_ERROR)
return FALSE; do {
// first allocate buffer for NETRESOURCE structures ...
lpnrLocal = (LPNETRESOURCE) GlobalAlloc( GPTR, dwBuffer ) ; dwRet = WNetEnumResource(
hEnum, // resource-handle
&dwEntries,
lpnrLocal,
&dwBuffer
) ; if( dwRet == NO_ERROR )
{
for( register DWORD i = 0 ; i < dwEntries ; i++ )
{
if(lpnrLocal[i].dwDisplayType == RESOURCEDISPLAYTYPE_SERVER)
{
CString kk = lpnrLocal[i].lpRemoteName;
m_CtrlList.AddString(kk);
}
if( RESOURCEUSAGE_CONTAINER == (lpnrLocal[i].dwUsage & RESOURCEUSAGE_CONTAINER)
&& lpnrLocal[i].dwDisplayType != RESOURCEDISPLAYTYPE_SERVER )
NetEnum(&lpnrLocal[i], dwFlags_p);
}
}
} while( dwRet != ERROR_NO_MORE_ITEMS ); if( lpnrLocal )
GlobalFree((HGLOBAL) lpnrLocal);
WNetCloseEnum(hEnum) ;
return TRUE;}
用函数SendARP(...)
//The following code demonstrates how to obtain the media access
//control (MAC) address associated with a specified IP address.
//
// Link with ws2_32.lib and iphlpapi.lib
//#include <windows.h>
#include <stdio.h>
#include <tchar.h>
#include <iphlpapi.h>
int __cdecl main()
{
HRESULT hr;
IPAddr ipAddr;
ULONG pulMac[2];
ULONG ulLen; ipAddr = inet_addr ("216.145.25.31");
memset (pulMac, 0xff, sizeof (pulMac));
ulLen = 6;
hr = SendARP (ipAddr, 0, pulMac, &ulLen);
printf ("Return %08x, length %8d\n", hr, ulLen);
size_t i, j;
char * szMac = new char[ulLen*3];
PBYTE pbHexMac = (PBYTE) pulMac; //
// Convert the binary MAC address into human-readable
//
for (i = 0, j = 0; i < ulLen - 1; ++i) {
j += sprintf (szMac + j, "%02X:", pbHexMac[i]);
}
sprintf (szMac + j, "%02X", pbHexMac[i]);
printf ("MAC address %s\n", szMac);
delete [] szMac; return 0;
}//
//Requirements
// Windows NT/2000/XP: Included in Windows 2000 and later.
// Windows 95/98/Me: Unsupported.
// Header: Declared in Iphlpapi.h.
// Library: Use Iphlpapi.lib.
{
int numberOfHost = 1;
struct hostent *remoteHostent; //处理命令行参数
if ( argc == 3 )
numberOfHost = atoi( argv[2] );
if ( ( argc >3 ) || ( argc < 2 ) )
{
printf( "RmtHost v0.2 - Get remote HostName /MacAddress\n" );
printf( "by ShotgunLabs ( [email protected] )\n\n" );
printf( "Usage :\n\tRmtHost.exe [RemoteIP] \n\n" );
printf( "Example:\n\tRmtHost.exe 192.168.0.3\n" );
printf( "\tRmtHost.exe 192.168.0.3 255\n\n" );
exit( 0 );
} //初始化SOCKET
WSADATA wsaData;
int iRet = WSAStartup(MAKEWORD(2,1), &wsaData);
if ( iRet != 0 )
{
printf( "WSAStartup Error:%d\n", GetLastError() );
exit( 0 );
}
int nRemoteAddr = inet_addr( argv[1] );
remoteHostent= (struct hostent*)malloc( sizeof(struct hostent ));
struct in_addr sa;
for ( int i = 0; i < numberOfHost; i ++ )
{
//获取远程机器名
sa.s_addr = nRemoteAddr;
printf( "\nIpAddress : %s\n", inet_ntoa( sa ) );
remoteHostent = gethostbyaddr( (char*)&nRemoteAddr,4, AF_INET );
if ( remoteHostent )
printf( "HostName : %s\n",remoteHostent->h_name );
else
printf( "gethostbyaddr Error:%d\n",GetLastError() );
//发送ARP查询包获得远程MAC地址 unsigned char macAddress[6];
ULONG macAddLen = 6;
iRet=SendARP(nRemoteAddr, (unsigned long)NULL,(PULONG)&macAddress, &macAddLen);
if ( iRet == NO_ERROR )
{
printf( "MacAddress: " );
for( int i =0; i<6; i++ )
{
printf( "%.2x", macAddress[i] );
if ( i<5 ) printf( "-" );
}
printf( "\n" );
}
else
printf( "SendARP Error:%d\n", GetLastError());
nRemoteAddr = htonl( ntohl( nRemoteAddr ) + 1 );
}
}
// Note: Win2000 only
// NOT NT 4.0, Win9x, WinME#pragma comment( lib, "Iphlpapi" )
#pragma comment( lib, "Ws2_32" )#include <windows.h>
#include <Iphlpapi.h>int main( ) {IPAddr ip = 0;
ULONG mac = 0;
DWORD error = 0; DWORD dwSize = sizeof( ULONG) ;
ip = inet_addr("192.168.0.100");
//ip = inet_addr("xxx.xxx.xxx.xxx");
error = SendARP(ip,0,&mac,&dwSize); return 0;
}