如何编程获取arp -a的信息 我们在电脑上运行arp -a可以获取本机很多ip地址和mac地址的对应关系,我希望通过程序得到这些信息? 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 使用NetBios可以得到MAC地址.#include <nb30.h>#pragma comment(lib, "netapi32")#pragma message("Auto Link NetAPI32 DLL ...") /******************************************************************************** GetMACAddr*<功 能> : 取网卡MAC地址.<参 数> : [out] mac MAC地址.<返 回 值> : 如果取得成功就返回TRUE, 否则返回FALSE.<备 注> : <修改历史> :******************************************************************************/BOOLGetMACAddr( MAC_ADDR mac ){ NCB ncb; typedef struct _ASTAT_ { ADAPTER_STATUS adapt; NAME_BUFFER NameBuff [30]; } ASTAT, * PASTAT; ASTAT Adapter; // ADAPTER_STATUS Adapter; LANA_ENUM lana_enum; UCHAR uRetCode; memset( &ncb, 0, sizeof(ncb) ); memset( &lana_enum, 0, sizeof(lana_enum)); ncb.ncb_command = NCBENUM; ncb.ncb_buffer = (unsigned char *) &lana_enum; ncb.ncb_length = sizeof(LANA_ENUM); uRetCode = Netbios( &ncb ); if( uRetCode != NRC_GOODRET ) { return FALSE; } for( int lana=0; lana<lana_enum.length; lana++ ) { ncb.ncb_command = NCBRESET; ncb.ncb_lana_num = lana_enum.lana[lana]; uRetCode = Netbios( &ncb ); if( uRetCode == NRC_GOODRET ) break ; } if( uRetCode != NRC_GOODRET ) { return FALSE; } memset( &ncb, 0, sizeof(ncb) ); ncb.ncb_command = NCBASTAT; ncb.ncb_lana_num = lana_enum.lana[0]; strcpy( (char* )ncb.ncb_callname, "*" ); ncb.ncb_buffer = (unsigned char *) &Adapter; ncb.ncb_length = sizeof(Adapter); uRetCode = Netbios( &ncb ); if( uRetCode != NRC_GOODRET ) { return FALSE; } memcpy( (void*)mac.m_chByte, Adapter.adapt.adapter_address, 6 ); return TRUE;}至于取本地IP地址, 可以调用gethostname先取得本地计算机的名称, 再调用gethostbyaddr得到IP地址. oyljerry(☆勇敢的心☆-Paper Writing) 老兄能不能详细点GetMacTable是什么,我在msdn中也没有找到谢谢 使用Arp协议,Winpcap编程可以解决请参考http://dev.csdn.net/develop/article/48/48331.shtm ARP表就是个字符串数组全局变量而已.不知道TNND MS有没有提供访问的接口,反正LINUX是很容易的 用代码来执行dos命令也可以取得到这些信息:#define EXECDOSCMD "arp -a" //可以换成你的命令BOOL ExecDosCmd(){ SECURITY_ATTRIBUTES sa; HANDLE hRead,hWrite; sa.nLength = sizeof(SECURITY_ATTRIBUTES); sa.lpSecurityDescriptor = NULL; sa.bInheritHandle = TRUE; if (!CreatePipe(&hRead,&hWrite,&sa,0)) { return FALSE; } STARTUPINFO si; PROCESS_INFORMATION pi; si.cb = sizeof(STARTUPINFO); GetStartupInfo(&si); si.hStdError = hWrite; si.hStdOutput = hWrite; si.wShowWindow = SW_HIDE; si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES; //关键步骤,CreateProcess函数参数意义请查阅MSDN if (!CreateProcess(NULL, EXECDOSCMD ,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi)) { return FALSE; } CloseHandle(hWrite); char buffer[4096] = {0}; DWORD bytesRead; while (true) { if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL) break; //buffer中就是执行的结果,可以保存到文本,也可以直接输出 printf(buffer); Sleep(200); } return TRUE;} 应该用IpHelper库,链接的时候找到IpHlper.libvoid OnARP(HWND hwnd){ DWORD dwSize; MIB_IPNETTABLE *IpNet; MIB_IPADDRTABLE *IpAddr; char szTemp[10]; HDC hdc; PAINTSTRUCT ps ; RECT rect ; TEXTMETRIC tm; int cxChar, cxCaps, cyChar; iIndex = 0; hdc = BeginPaint (hwnd, &ps) ; GetClientRect (hwnd, &rect) ; InvalidateRect(hwnd, &rect, FALSE); GetTextMetrics(hdc, &tm); cxChar = tm.tmAveCharWidth; cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2 )* cxChar /2; cyChar = tm.tmHeight + tm.tmExternalLeading; IpNet = (MIB_IPNETTABLE *)GlobalAlloc( GPTR, sizeof( MIB_IPNETTABLE ) ); dwSize = sizeof( MIB_IPNETTABLE ); if( ERROR_BUFFER_OVERFLOW == GetIpNetTable( IpNet ,&dwSize, true) ) { GlobalFree( IpNet ); IpNet =(MIB_IPNETTABLE*) GlobalAlloc( GPTR, dwSize ); } if( NO_ERROR == GetIpNetTable( IpNet ,&dwSize, true) ) { struct in_addr in; char szStdout[30]; char szType[][10] = {"Unknown", "Other", "Invalid", "Dynamic", "Static" "\x0"}; for( DWORD i=0 ; i < IpNet->dwNumEntries ; i++ ) { in.S_un.S_addr = IpNet->table[i].dwAddr; ::TextOut(hdc, 0, cyChar * iIndex, inet_ntoa(in), lstrlen(inet_ntoa(in))); sprintf(szStdout, "%02X", IpNet->table[i].bPhysAddr[0]); for(UINT j=1 ; j < IpNet->table[i].dwPhysAddrLen ; j++) { sprintf(szTemp, "-%02X",IpNet->table[i].bPhysAddr[j]); strcat(szStdout, szTemp); } ::TextOut(hdc, 300, cyChar * iIndex++, szType[IpNet->table[i].dwType], lstrlen(szType[IpNet->table[i].dwType])); } } EndPaint (hwnd, &ps) ; } 如何还原最大化与最小化按钮 关于select函数返回的问题 求助:窗口过程的问题! 如何改变应用程序的窗口大小? 基于MFC动态连接库的问题 WS_EX_TRANSPARENT创建透明窗口的问题?(分不够可以再加) 我把外国人做的程序的菜单改成中国汉字怎么有乱码怎么解决 多线程串口通讯问题,请jjjtang(小桂子) 一定要进 今天伤心,编译原理实验做不出,没什么分,但是要发泄一下! 背景颜色设置 要在mdi里创建一个占满整个MDIFRAME的控件? 如何读取一个文件到编辑控件?
#pragma comment(lib, "netapi32")
#pragma message("Auto Link NetAPI32 DLL ...")
/******************************************************************************
*
* GetMACAddr
*
<功 能> : 取网卡MAC地址.
<参 数> : [out] mac MAC地址.
<返 回 值> : 如果取得成功就返回TRUE, 否则返回FALSE.
<备 注> :
<修改历史> :
******************************************************************************/
BOOL
GetMACAddr( MAC_ADDR mac )
{
NCB ncb; typedef struct _ASTAT_
{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuff [30];
} ASTAT, * PASTAT;
ASTAT Adapter;
// ADAPTER_STATUS Adapter;
LANA_ENUM lana_enum;
UCHAR uRetCode; memset( &ncb, 0, sizeof(ncb) );
memset( &lana_enum, 0, sizeof(lana_enum)); ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (unsigned char *) &lana_enum;
ncb.ncb_length = sizeof(LANA_ENUM);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
{
return FALSE;
} for( int lana=0; lana<lana_enum.length; lana++ )
{
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[lana];
uRetCode = Netbios( &ncb );
if( uRetCode == NRC_GOODRET ) break ;
}
if( uRetCode != NRC_GOODRET )
{
return FALSE;
} memset( &ncb, 0, sizeof(ncb) );
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[0];
strcpy( (char* )ncb.ncb_callname, "*" );
ncb.ncb_buffer = (unsigned char *) &Adapter;
ncb.ncb_length = sizeof(Adapter);
uRetCode = Netbios( &ncb );
if( uRetCode != NRC_GOODRET )
{
return FALSE;
} memcpy( (void*)mac.m_chByte, Adapter.adapt.adapter_address, 6 ); return TRUE;
}至于取本地IP地址, 可以调用gethostname先取得本地计算机的名称, 再调用gethostbyaddr得到IP地址.
GetMacTable
是什么,我在msdn中也没有找到
谢谢
请参考http://dev.csdn.net/develop/article/48/48331.shtm
不知道TNND MS有没有提供访问的接口,反正LINUX是很容易的
BOOL ExecDosCmd()
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess(NULL, EXECDOSCMD
,NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
DWORD bytesRead;
while (true)
{
if (ReadFile(hRead,buffer,4095,&bytesRead,NULL) == NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
printf(buffer);
Sleep(200);
}
return TRUE;
}
void OnARP(HWND hwnd)
{
DWORD dwSize;
MIB_IPNETTABLE *IpNet;
MIB_IPADDRTABLE *IpAddr;
char szTemp[10];
HDC hdc;
PAINTSTRUCT ps ;
RECT rect ;
TEXTMETRIC tm;
int cxChar, cxCaps, cyChar;
iIndex = 0;
hdc = BeginPaint (hwnd, &ps) ;
GetClientRect (hwnd, &rect) ;
InvalidateRect(hwnd, &rect, FALSE);
GetTextMetrics(hdc, &tm);
cxChar = tm.tmAveCharWidth;
cxCaps = (tm.tmPitchAndFamily & 1 ? 3 : 2 )* cxChar /2;
cyChar = tm.tmHeight + tm.tmExternalLeading;
IpNet = (MIB_IPNETTABLE *)GlobalAlloc( GPTR, sizeof( MIB_IPNETTABLE ) );
dwSize = sizeof( MIB_IPNETTABLE ); if( ERROR_BUFFER_OVERFLOW == GetIpNetTable( IpNet ,&dwSize, true) )
{
GlobalFree( IpNet );
IpNet =(MIB_IPNETTABLE*) GlobalAlloc( GPTR, dwSize );
} if( NO_ERROR == GetIpNetTable( IpNet ,&dwSize, true) )
{
struct in_addr in;
char szStdout[30];
char szType[][10] = {"Unknown",
"Other",
"Invalid",
"Dynamic",
"Static"
"\x0"};
for( DWORD i=0 ; i < IpNet->dwNumEntries ; i++ )
{
in.S_un.S_addr = IpNet->table[i].dwAddr;
::TextOut(hdc, 0, cyChar * iIndex, inet_ntoa(in), lstrlen(inet_ntoa(in))); sprintf(szStdout, "%02X", IpNet->table[i].bPhysAddr[0]);
for(UINT j=1 ; j < IpNet->table[i].dwPhysAddrLen ; j++)
{
sprintf(szTemp, "-%02X",IpNet->table[i].bPhysAddr[j]);
strcat(szStdout, szTemp);
}
::TextOut(hdc, 300, cyChar * iIndex++, szType[IpNet->table[i].dwType], lstrlen(szType[IpNet->table[i].dwType]));
}
}
EndPaint (hwnd, &ps) ;
}