如何获取连接到无线AP的设备的MAC和IP-CSDN论坛

2025-05-05 13:16:16
推荐回答(1个)
回答1:

#pragma comment(lib,"netapi32.lib") /* netbios api */

typedef struct adp_name_s
{
ADAPTER_STATUS adapt;
NAME_BUFFER name[4];
} ADP_NAME;

/**************************************************************************
*
* 函数功能: 得到以太网的硬件地址.
*
* 参数说明: [OUT] mac_addr, 硬件地址缓冲区.
* [IN] length, mac_addr 的长度.
*
* 返 回 值: 成功返回 0, 失败返回 -1.
*
**************************************************************************/
static int bootp_get_mac_addr(char *mac_addr, int length)
{
NCB ncb;
UCHAR ret_code;
LANA_ENUM lana_enum;
ADP_NAME adapter;
int i;

/* 得到 LANA 个数 */
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBENUM;
ncb.ncb_buffer = (UCHAR *)&lana_enum;
ncb.ncb_length = sizeof(lana_enum);
ret_code = Netbios(&ncb);

for (i = 0; i < lana_enum.length; i++)
{
/* 重设网卡 */
memset(&ncb, 0, sizeof(ncb));
ncb.ncb_command = NCBRESET;
ncb.ncb_lana_num = lana_enum.lana[i];
ret_code = Netbios(&ncb);

/* 得到硬件信息 */
memset(&ncb, 0, sizeof (ncb));
ncb.ncb_command = NCBASTAT;
ncb.ncb_lana_num = lana_enum.lana[i];

memset(ncb.ncb_callname, 0x20, NCBNAMSZ);
ncb.ncb_callname[0] = '*';
ncb.ncb_buffer = (char *)&adapter;
ncb.ncb_length = sizeof(adapter);

ret_code = Netbios(&ncb);

/* NRC_GOODRET 表示成功, 0xFE 是以太网 */
if (ret_code != NRC_GOODRET || adapter.adapt.adapter_type != 0xFE)
continue;

/* 到达这里说明可以得到硬件地址 */
length = length > BOOTP_HRD_LEN ? BOOTP_HRD_LEN : length;
memcpy(mac_addr, adapter.adapt.adapter_address, length);

return 0;
}

return -1;
}