大家帮我看看,还是关于检测MAC地址的问题,附带源码和编译时出现的错误。

Andrionda 2004-11-08 10:27:05
大家帮我看看,已经来这里问过好几次拉,给大家添麻烦啦!呵呵


#include <vcl.h>
#pragma hdrstop
#pragma hdrstop
#include <condefs.h>
#include <windows.h>
#include <stdio.h>

typedef struct_NCB{
UCHAR ncb_command; //命令码
UCHAR ncb_retcode; //返回码
UCHAR ncb_lsn; //本地会话编码
UCHAR ncb_num; //数据报
ADD NAME
PUCHAR ncb_buffer; //信息缓冲区
WORD ncb_length; //信息缓冲区长度
UCHAR ncb_callname[NCBNAMSZ]; //CALL 的远程系统名
UCHAR neb_name[NCBNAMSZ]; //本地适配器网络名
UCHAR ncb_rto; //以 1/2s 为单位的接收超时UCHAR ncb_sto; //以 1/2s 为单位的发送超时void(*ncb_post)(struct_NCB*); //POST 例程指针
UCHAR ncb_lana_num; //执行命令的网络适配器编号
UCHAR ncb_cmd_cplt; //0XFF 命令挂起,否则命令结束
UCHAR ncb_reserve[10]; //保留值
HANDLE ncb_event; //事件句柄
} NCB;


typedef struct ASTAT{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuffer[30];
}
ASTAT, *PASTAT;
ASTAT Adapter;//自定义复位适配器函数
bool ClearAdapter(NCB ncb);



//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
NCB ncb;
UCHAR uRetCode;
ncb.ncb_command=NCBASTAT;
ncb.ncb_lana_num=0;
strcpy((char *)ncb.ncb_callname,"*");
ncb.ncb_buffer=(unsigned char *) &;Adapter;
ncb.ncb_length=sizeof(Adapter);
uRetCode=Netbios(&;ncb);
printf("The NCBASTAT returned code is OX%x\n",uRetCode);
if(uRetCode==0)
{
printf( "The Ethernet Number is: %02x_%02x_%02x_%02x_%02x_%02x\n",
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] );
if(Adapter.adapt.adapter_type==0xFF)
printf("The adapter is Token Ring adapter.\n");
else
if(Adapter.adapt.adapter_type==0xFE)
printf("The adapter is Ethernet adapter.\n");
printf("The software-release level is %d.%d\n",Adapter.adapt.rev_major,Adapter.adapt.rev_minor);
printf("The number of names in the local names table is %d\n",Adapter.adapt.name_count);
for(int i=0;i<;Adapter.adapt.name_count;i++)
printf("%s\n",Adapter.NameBuffer[i].name);
}//注意下面程序代码故意出错误
char Remote[16]="202.112.87.221";//先复位网络适配器
ClearAdapter(ncb);
memset(&,ncb,0,sizeof(ncb));//命令码为发送数据
ncb.ncb_command=NCBSEND;
ncb.ncb_lana_num=0;
ncb.ncb_lsn=4;
ncb.ncb_sto=2;
strcpy(ncb.ncb_callname,Remote);
//strcpy((char *)ncb.ncb_callname,"* ");
ncb.ncb_buffer=(unsigned char *) &;Adapter;
ncb.ncb_length=sizeof(Adapter);
uRetCode=Netbios(&;ncb);
printf("The NCBASTAT returned code is OX%x\n",uRetCode);
printf("The number of FRMR frames received is %d\n",Adapter.adapt.frmr_recv);
printf("The number of FRMR frames transmitted is %d\n",Adapter.adapt.frmr_xmit);
getchar();
return 0;
}
//---------------------------------------------------------------------------
bool ClearAdapter(NCB ncb)
{
memset(&;ncb,0,sizeof(ncb));
ncb.ncb_command=NCBRESET;
ncb.ncb_lana_num=0;
Netbios(&;ncb);
return true;
}









出现的错误如下:

[C++ Error] Unit1.cpp(21): E2257 , expected
[C++ Error] Unit1.cpp(39): E2303 Type name expected
[C++ Error] Unit1.cpp(39): E2139 Declaration missing ;
[C++ Error] Unit1.cpp(40): E2303 Type name expected
[C++ Error] Unit1.cpp(40): E2139 Declaration missing ;
[C++ Error] Unit1.cpp(44): E2147 'NCB' cannot start a parameter declaration
[C++ Error] Unit1.cpp(47): E2451 Undefined symbol 'NCB'
[C++ Error] Unit1.cpp(47): E2379 Statement missing ;
[C++ Error] Unit1.cpp(49): E2451 Undefined symbol 'ncb'
[C++ Error] Unit1.cpp(49): E2451 Undefined symbol 'NCBASTAT'
[C++ Error] Unit1.cpp(52): E2188 Expression syntax
[C++ Error] Unit1.cpp(54): E2268 Call to undefined function 'Netbios'
[C++ Error] Unit1.cpp(54): E2188 Expression syntax
[C++ Error] Unit1.cpp(54): E2379 Statement missing ;
[C++ Error] Unit1.cpp(59): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(60): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(61): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(62): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(63): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(64): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(65): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(67): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(69): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(69): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(70): E2316 'adapt' is not a member of 'ASTAT'
[C++ Error] Unit1.cpp(70): E2228 Too many error or warning messages
...全文
152 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
Andrionda 2004-11-08
  • 打赏
  • 举报
回复
还有一点就是我的网卡MAC地址是:00-E0-4C-C5-C8-2E而程序运行产生如下数据:
The NCBASTAT returned code is OX34
The NCBASTAT returned code is OX8
The number of FRMR frames received is 0
The number of FRMR frames transmitted is 0
不是网卡的MAC地址阿!!!
Andrionda 2004-11-08
  • 打赏
  • 举报
回复
哈哈 谢谢楼上的 竟然通过拉!!我把源代码贴出来 大家再看看;

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop
#pragma hdrstop
#include <condefs.h>
#include <windows.h>
#include <stdio.h>
#include <nb30.h>

typedef struct ASTAT{
ADAPTER_STATUS adapt;
NAME_BUFFER NameBuffer[30];
}
ASTAT, *PASTAT;
ASTAT Adapter;//自定义复位适配器函数
bool ClearAdapter(NCB ncb);



//---------------------------------------------------------------------------

#pragma argsused
int main(int argc, char* argv[])
{
NCB ncb;
UCHAR uRetCode;
ncb.ncb_command=NCBASTAT;
ncb.ncb_lana_num=0;
strcpy((char *)ncb.ncb_callname,"*");
ncb.ncb_buffer=(unsigned char *) &Adapter;
ncb.ncb_length=sizeof(Adapter);
uRetCode=Netbios(&ncb);
printf("The NCBASTAT returned code is OX%x\n",uRetCode);
if(uRetCode==0)
{
printf( "The Ethernet Number is: %02x_%02x_%02x_%02x_%02x_%02x\n",
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] );
if(Adapter.adapt.adapter_type==0xFF)
printf("The adapter is Token Ring adapter.\n");
else
if(Adapter.adapt.adapter_type==0xFE)
printf("The adapter is Ethernet adapter.\n");
printf("The software-release level is %d.%d\n",Adapter.adapt.rev_major,Adapter.adapt.rev_minor);
printf("The number of names in the local names table is %d\n",Adapter.adapt.name_count);
for(int i=0;i<Adapter.adapt.name_count;i++)
printf("%s\n",Adapter.NameBuffer[i].name);
}//注意下面程序代码故意出错误
char Remote[16]="202.112.87.221";//先复位网络适配器
ClearAdapter(ncb);
memset(&ncb,0,sizeof(ncb));//命令码为发送数据
ncb.ncb_command=NCBSEND;
ncb.ncb_lana_num=0;
ncb.ncb_lsn=4;
ncb.ncb_sto=2;
strcpy(ncb.ncb_callname,Remote);
//strcpy((char *)ncb.ncb_callname,"* ");
ncb.ncb_buffer=(unsigned char *) &Adapter;
ncb.ncb_length=sizeof(Adapter);
uRetCode=Netbios(&ncb);
printf("The NCBASTAT returned code is OX%x\n",uRetCode);
printf("The number of FRMR frames received is %d\n",Adapter.adapt.frmr_recv);
printf("The number of FRMR frames transmitted is %d\n",Adapter.adapt.frmr_xmit);
getchar();
return 0;
}
//---------------------------------------------------------------------------
bool ClearAdapter(NCB ncb)
{
memset(&ncb,0,sizeof(ncb));
ncb.ncb_command=NCBRESET;
ncb.ncb_lana_num=0;
Netbios(&ncb);
return true;
}
constantine 2004-11-08
  • 打赏
  • 举报
回复
#include <nb30.h> 里面有定义NCB
很多地方(&;Adapter;)都多了点东西,改为(&Adapter;)
自己慢慢改就好了
Andrionda 2004-11-08
  • 打赏
  • 举报
回复
谢谢你 自在。一下子就检测到了我的网卡MAC地址!谢谢你们,楼上的各位朋友。
milkwayhong 2004-11-08
  • 打赏
  • 举报
回复
你比较一下:
这是在别人代码的基础上改的,编译后可单独执行
#include <windows.h>
#include <stdio.h>
#include <time.h>
#include <stdlib.h>

///////////////////////////////////////////////////////////////////////////////
// You can either link directly to Iphlpapi.lib:
//
// #include <Iphlpapi.h>
// #pragma comment(lib, "Iphlpapi.lib")
//
// but instead we will dynamically load GetAdaptersInfo so
// the code will at least compile and load on Windows 95...
// So we have to copy some stuff declared in iptypes.h:

#define MAX_ADAPTER_DESCRIPTION_LENGTH 128 // arb.
#define MAX_ADAPTER_NAME_LENGTH 256 // arb.
#define MAX_ADAPTER_ADDRESS_LENGTH 8 // arb.

//
// IP_ADDRESS_STRING - store an IP address as a dotted decimal string
//

typedef struct {
char String[4 * 4];
} IP_ADDRESS_STRING, *PIP_ADDRESS_STRING, IP_MASK_STRING, *PIP_MASK_STRING;

//
// IP_ADDR_STRING - store an IP address with its corresponding subnet mask,
// both as dotted decimal strings
//

typedef struct _IP_ADDR_STRING {
struct _IP_ADDR_STRING* Next;
IP_ADDRESS_STRING IpAddress;
IP_MASK_STRING IpMask;
DWORD Context;
} IP_ADDR_STRING, *PIP_ADDR_STRING;

//
// ADAPTER_INFO - per-adapter information. All IP addresses are stored as
// strings
//

typedef struct _IP_ADAPTER_INFO {
struct _IP_ADAPTER_INFO* Next;
DWORD ComboIndex;
char AdapterName[MAX_ADAPTER_NAME_LENGTH + 4];
char Description[MAX_ADAPTER_DESCRIPTION_LENGTH + 4];
UINT AddressLength;
BYTE Address[MAX_ADAPTER_ADDRESS_LENGTH];
DWORD Index;
UINT Type;
UINT DhcpEnabled;
PIP_ADDR_STRING CurrentIpAddress;
IP_ADDR_STRING IpAddressList;
IP_ADDR_STRING GatewayList;
IP_ADDR_STRING DhcpServer;
BOOL HaveWins;
IP_ADDR_STRING PrimaryWinsServer;
IP_ADDR_STRING SecondaryWinsServer;
time_t LeaseObtained;
time_t LeaseExpires;
} IP_ADAPTER_INFO, *PIP_ADAPTER_INFO;

typedef DWORD (WINAPI* GetAdaptersInfoFunc)(
PIP_ADAPTER_INFO pAdapterInfo, // buffer to receive data
PULONG pOutBufLen // size of data returned
);
///////////////////////////////////////////////////////////////////////////////

void MacAddressToString(const LPBYTE Address, LPSTR lpsz, int nAddressLength = 6)
{
int n;
LPSTR p = lpsz;
for (n = 0; n < nAddressLength; n++)
{
p += sprintf(p, n ? "-%02x" : "%02x", Address[n]);
}
}

void main()
{
HMODULE hLib;
GetAdaptersInfoFunc GetAdaptersInfo = NULL;

PIP_ADAPTER_INFO pai = NULL;
DWORD dwSize = 0;
CHAR szMac[64];

hLib = LoadLibrary("Iphlpapi.dll");
if (!hLib)
{
puts("Failed to load Iphlpapi.dll");
exit(1);
}

GetAdaptersInfo = (GetAdaptersInfoFunc)GetProcAddress(hLib, "GetAdaptersInfo");
if (GetAdaptersInfo == NULL)
{
puts("Failed to load GetAdaptersInfo in Iphlpapi.dll");
}

// Get size of buffer needed:
GetAdaptersInfo(NULL, &dwSize);

pai = (PIP_ADAPTER_INFO)GlobalAlloc(GPTR, dwSize);
GetAdaptersInfo(pai, &dwSize);

PIP_ADAPTER_INFO p = pai;
/*
while (p)
{
MacAddressToString(p->Address, szMac, p->AddressLength);
printf("%s: %s\n", p->Description, szMac);
p = p->Next;
}
*/
MacAddressToString(p->Address, szMac, p->AddressLength);
printf("%s\n", szMac);

GlobalFree(pai);
FreeLibrary(hLib);
}

1,317

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder 网络及通讯开发
社区管理员
  • 网络及通讯开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧