void main()
{
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionInitEx m_InitEx;
pSnmpExtensionQuery m_Query;
pSnmpExtensionTrap m_Trap;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = (1, 3, 6, 1, 2, 1, 2, 2, 1, 3);
UINT OID_ifEntryNum[] = (1, 3, 6, 1, 2, 1, 2, 1);
UINT OID_ipMACEntAddr[] = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6);
AsnObjectIdentifier MIB_ifMACEntAddr =
( sizeof(OID_ipMACEntAddr) sizeof(UINT), OID_ipMACEntAddr );
AsnObjectIdentifier MIB_ifEntryType =
(sizeof(OID_ifEntryType) sizeof(UINT), OID_ifEntryType);
AsnObjectIdentifier MIB_ifEntryNum =
(sizeof(OID_ifEntryNum) sizeof(UINT), OID_ifEntryNum);
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = (0, 0);
int ret;
int dtmp;
int i = 0, j = 0;
bool found = false;
char TempEthernet[13];
m_Init = NULL;
m_InitEx = NULL;
m_Query = NULL;
m_Trap = NULL; /* 载入SNMP DLL并取得实例句柄 */
m_hInst = LoadLibrary("inetmib1.dll");
if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)
{
m_hInst = NULL;
return;
}
m_Init =
(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_InitEx =
(pSnmpExtensionInitEx) GetProcAddress(m_hInst,
"SnmpExtensionInitEx");
m_Query =
(pSnmpExtensionQuery) GetProcAddress(m_hInst,
"SnmpExtensionQuery");
m_Trap =
(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView); /* 初始化用来接收m_Query查询结果的变量列表 */
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL; /* 在OID中拷贝并查找接口表中的入口数量 */
varBindList.len = 1; /* Only retrieving one item */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
printf("# of adapters in this system : %in",
varBind[0].value.asnValue.number);
varBindList.len = 2; /* 拷贝OID的ifType-接口类型 */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType); /* 拷贝OID的ifPhysAddress-物理地址 */
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr); do
{ /* 提交查询,结果将载入 varBindList。
可以预料这个循环调用的次数和系统中的接口卡数量相等 */
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
if (!ret)
ret = 1;
else
/* 确认正确的返回类型 */
ret =
SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
MIB_ifEntryType.idLength); if (!ret) (
j++;
dtmp = varBind[0].value.asnValue.number;
printf("Interface #%i type : %in", j, dtmp); /* Type 6 describes ethernet interfaces */
if (dtmp == 6)
{ /* 确认我们已经在此取得地址 */
ret =
SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
MIB_ifMACEntAddr.idLength);
if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))
{
if((varBind[1].value.asnValue.address.stream[0] == 0x44)
&& (varBind[1].value.asnValue.address.stream[1] == 0x45)
&& (varBind[1].value.asnValue.address.stream[2] == 0x53)
&& (varBind[1].value.asnValue.address.stream[3] == 0x54)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00))
{
/* 忽略所有的拨号网络接口卡 */
printf("Interface #%i is a DUN adaptern", j);
continue;
}
if ((varBind[1].value.asnValue.address.stream[0] == 0x00)
&& (varBind[1].value.asnValue.address.stream[1] == 0x00)
&& (varBind[1].value.asnValue.address.stream[2] == 0x00)
&& (varBind[1].value.asnValue.address.stream[3] == 0x00)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00)
&& (varBind[1].value.asnValue.address.stream[5] == 0x00))
{
/* 忽略由其他的网络接口卡返回的NULL地址 */
printf("Interface #%i is a NULL addressn", j);
continue;
}
sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
printf("MAC Address of interface #%i: %sn", j,
TempEthernet);)
}
}
} while (!ret); /* 发生错误终止。 */
getch(); FreeLibrary(m_hInst);
/* 解除绑定 */
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
}
{
HINSTANCE m_hInst;
pSnmpExtensionInit m_Init;
pSnmpExtensionInitEx m_InitEx;
pSnmpExtensionQuery m_Query;
pSnmpExtensionTrap m_Trap;
HANDLE PollForTrapEvent;
AsnObjectIdentifier SupportedView;
UINT OID_ifEntryType[] = (1, 3, 6, 1, 2, 1, 2, 2, 1, 3);
UINT OID_ifEntryNum[] = (1, 3, 6, 1, 2, 1, 2, 1);
UINT OID_ipMACEntAddr[] = (1, 3, 6, 1, 2, 1, 2, 2, 1, 6);
AsnObjectIdentifier MIB_ifMACEntAddr =
( sizeof(OID_ipMACEntAddr) sizeof(UINT), OID_ipMACEntAddr );
AsnObjectIdentifier MIB_ifEntryType =
(sizeof(OID_ifEntryType) sizeof(UINT), OID_ifEntryType);
AsnObjectIdentifier MIB_ifEntryNum =
(sizeof(OID_ifEntryNum) sizeof(UINT), OID_ifEntryNum);
RFC1157VarBindList varBindList;
RFC1157VarBind varBind[2];
AsnInteger errorStatus;
AsnInteger errorIndex;
AsnObjectIdentifier MIB_NULL = (0, 0);
int ret;
int dtmp;
int i = 0, j = 0;
bool found = false;
char TempEthernet[13];
m_Init = NULL;
m_InitEx = NULL;
m_Query = NULL;
m_Trap = NULL; /* 载入SNMP DLL并取得实例句柄 */
m_hInst = LoadLibrary("inetmib1.dll");
if (m_hInst < (HINSTANCE) HINSTANCE_ERROR)
{
m_hInst = NULL;
return;
}
m_Init =
(pSnmpExtensionInit) GetProcAddress(m_hInst, "SnmpExtensionInit");
m_InitEx =
(pSnmpExtensionInitEx) GetProcAddress(m_hInst,
"SnmpExtensionInitEx");
m_Query =
(pSnmpExtensionQuery) GetProcAddress(m_hInst,
"SnmpExtensionQuery");
m_Trap =
(pSnmpExtensionTrap) GetProcAddress(m_hInst, "SnmpExtensionTrap");
m_Init(GetTickCount(), &PollForTrapEvent, &SupportedView); /* 初始化用来接收m_Query查询结果的变量列表 */
varBindList.list = varBind;
varBind[0].name = MIB_NULL;
varBind[1].name = MIB_NULL; /* 在OID中拷贝并查找接口表中的入口数量 */
varBindList.len = 1; /* Only retrieving one item */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryNum);
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
printf("# of adapters in this system : %in",
varBind[0].value.asnValue.number);
varBindList.len = 2; /* 拷贝OID的ifType-接口类型 */
SNMP_oidcpy(&varBind[0].name, &MIB_ifEntryType); /* 拷贝OID的ifPhysAddress-物理地址 */
SNMP_oidcpy(&varBind[1].name, &MIB_ifMACEntAddr); do
{ /* 提交查询,结果将载入 varBindList。
可以预料这个循环调用的次数和系统中的接口卡数量相等 */
ret =
m_Query(ASN_RFC1157_GETNEXTREQUEST, &varBindList, &errorStatus,
&errorIndex);
if (!ret)
ret = 1;
else
/* 确认正确的返回类型 */
ret =
SNMP_oidncmp(&varBind[0].name, &MIB_ifEntryType,
MIB_ifEntryType.idLength); if (!ret) (
j++;
dtmp = varBind[0].value.asnValue.number;
printf("Interface #%i type : %in", j, dtmp); /* Type 6 describes ethernet interfaces */
if (dtmp == 6)
{ /* 确认我们已经在此取得地址 */
ret =
SNMP_oidncmp(&varBind[1].name, &MIB_ifMACEntAddr,
MIB_ifMACEntAddr.idLength);
if ((!ret) && (varBind[1].value.asnValue.address.stream != NULL))
{
if((varBind[1].value.asnValue.address.stream[0] == 0x44)
&& (varBind[1].value.asnValue.address.stream[1] == 0x45)
&& (varBind[1].value.asnValue.address.stream[2] == 0x53)
&& (varBind[1].value.asnValue.address.stream[3] == 0x54)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00))
{
/* 忽略所有的拨号网络接口卡 */
printf("Interface #%i is a DUN adaptern", j);
continue;
}
if ((varBind[1].value.asnValue.address.stream[0] == 0x00)
&& (varBind[1].value.asnValue.address.stream[1] == 0x00)
&& (varBind[1].value.asnValue.address.stream[2] == 0x00)
&& (varBind[1].value.asnValue.address.stream[3] == 0x00)
&& (varBind[1].value.asnValue.address.stream[4] == 0x00)
&& (varBind[1].value.asnValue.address.stream[5] == 0x00))
{
/* 忽略由其他的网络接口卡返回的NULL地址 */
printf("Interface #%i is a NULL addressn", j);
continue;
}
sprintf(TempEthernet, "%02x%02x%02x%02x%02x%02x",
varBind[1].value.asnValue.address.stream[0],
varBind[1].value.asnValue.address.stream[1],
varBind[1].value.asnValue.address.stream[2],
varBind[1].value.asnValue.address.stream[3],
varBind[1].value.asnValue.address.stream[4],
varBind[1].value.asnValue.address.stream[5]);
printf("MAC Address of interface #%i: %sn", j,
TempEthernet);)
}
}
} while (!ret); /* 发生错误终止。 */
getch(); FreeLibrary(m_hInst);
/* 解除绑定 */
SNMP_FreeVarBind(&varBind[0]);
SNMP_FreeVarBind(&varBind[1]);
}
解决方案 »
- delphi中如何用dbgride控件实现数据输入,并且每个单元格的输入都能像下拉列表一样!
- 比较难实现的问题,从主EXE调用另外一个EXE程序..请高手帮忙
- 关于平滑曲线的问题,有点难度啊
- 用DELPHI如何读写ORACLE数据库BLOB类型的字段?
- delphi的登陆窗口
- ListViewCustomDrawItem的问题
- 在adodataset的AfterScroll中写代码实现了在edit中显示dbgrid中的数据的功能,但是添加的功能就不可以用了
- 关于用Delphi调用VB写的DLL的问题?
- ODAC 中的oraquery 有没有updatebatch 这个属性的?
- 如何用一个label或image作超级Web链接或mail地址的链接
- 我的Delphi6中怎么没有FrameForm和EditForm呢?
- 我在窗体上动态创建了一个IMAGE控件,并且加载了一幅图片,现在要在该控件的双击事件中完成某些功能,怎样写这幅图片的双击事件?
Indy不就有TIdSNMP了,需要搞什么翻译这么麻烦的??
我怎麼說也算開發過snmp的, 但用 TIdSNMP 很多東西都調不出來!
當然, 不排除我個人水平的問題!www.loncomip.com
SNMP的具体协议内容:
http://www.rfc-editor.org/rfc/rfc1157.txtIndy不满足要求?不会自己改吗?有http://www.rfc-editor.org/rfc/rfc1157.txt的官方规定,改到满意为止了别指望Indy什么都能完成,Indy本身就有不少Bug了,我用Indy有3年多了,修改过Indy的N多Bug了。为什么需要Source版的组件?就是为了有问题自己改,不够用,自己扩充例如:Indy的组件不支持Tunnel代理,怎么办?自己添加处理就行了
IndyTCPServer很多时候关闭出错,为什么?SetActive中有问题导致的
Indy9对SSL证书支持有问题的,不能较验证书内容,同样可以通过手工写代码扩展
Indy的内部InputBuffer也有问题,TCPConnection都有...不只是Indy,Rave一样有,Rave不支持中文字段,真的吗?内部一个函数不兼容MBCS而已,改改就行
有Source和Demo的
synapse是简单小巧的组件,有时候会更好用的:)http://synapse.ararat.cz/files/contrib/snmpsyn.zip
需要组件http://synapse.ararat.cz/files/synasnap.zip
支持的
Help
http://synapse.ararat.cz/files/synahelp.zip
Demo
http://synapse.ararat.cz/files/synademo.zip官方站点http://synapse.ararat.cz/足够你解决问题的了:)
不过上面的程序不知大家知道在说什么吗那是一个用SNMP读MAC的例子希望对大家在帮助