C++Builder SNMP 编程基本成功,有个Bug,请高手帮忙
C++Builder SNMP 编程基本成功,有个Bug,请高手帮忙
是从VC代码中修改过来的,但些问题如下;
1. C++ Builder的Format()函数使用不了,全部更换为sprintf();
2. 逐次手动Get、GetNext调用AsnPrint()函数时不会出错,如果用while循环调用AsnPrint()函数时,下面的一句与CC3260MT.DLL产生冲突:
case ASN_OCTETSTRING: //Indicates an octet string variable.
strbuf.sprintf( "%s ",any-> asnValue.string.stream);
AsnPrint()函数用于代替SnmpUtilPrintAsnAny(),以方便分解出数据.
---------------------------------
bool AsnPrint(AsnAny* any, String &strbuf)
{
char * string = NULL;
//注意: 该函数中的 Format 全部已换成 sprintf
switch(any-> asnType)
{
case ASN_INTEGER: //Indicates a 32-bit signed integer variable.
strbuf.sprintf( "%d ", any-> asnValue.number);
break;
case ASN_UNSIGNED32: //Indicates a 32-bit unsigned integer variable.
strbuf.sprintf( "%u ", any-> asnValue.unsigned32);
break;
case ASN_COUNTER64: //Indicates a counter variable that increases
//until it reaches a maximum value of (2^64) 1.
strbuf.sprintf( "%I64u ",any-> asnValue.counter64);
break;
case ASN_OCTETSTRING: //Indicates an octet string variable.
strbuf.sprintf( "%s ",any-> asnValue.string.stream);
break;
case ASN_BITS: //Indicates a variable that is an enumeration of named bits.
strbuf = dumpOctStr((void*)any-> asnValue.bits.stream,any-> asnValue.bits.length);
break;
case ASN_OBJECTIDENTIFIER: //Indicates an object identifier variable.
SnmpMgrOidToStr(&(any-> asnValue.object), &string);
strbuf.sprintf( "%s ",string);
if(string)
SNMP_free(string);
break;
case ASN_SEQUENCE: //Indicates an ASN sequence variable.
strbuf.sprintf( "%s ",any-> asnValue.sequence.stream);
break;
case ASN_IPADDRESS: //Indicates an IP address variable.
strbuf = ul2addr(*((ULONG*)(any-> asnValue.address.stream)));
break;
case ASN_COUNTER32: //Indicates a counter variable.
strbuf.sprintf( "%u ",any-> asnValue.counter);
break;
case ASN_GAUGE32://Indicates a gauge variable.
strbuf.sprintf( "%u ",any-> asnValue.gauge);
break;
case ASN_TIMETICKS: //Indicates a timeticks variable.
strbuf.sprintf( "%u ",any-> asnValue.ticks);
break;
case ASN_OPAQUE: //Indicates an opaque variable.
//treated as octstring
strbuf = dumpOctStr((void*)any-> asnValue.arbitrary.stream,
any-> asnValue.arbitrary.length);
break;
default:
strbuf = "unknown value type "; //strbuf = _T( "unknown value type ");
return FALSE;
}
return TRUE;
}
-----------------------------------
函数调用方式如下:
RFC1157VarBindList variableBindings; //MIB值结构
String tempOidData; //Oid项数据
//SnmpUtilPrintAsnAny(&variableBindings.list[0].value);
AsnPrint(&variableBindings.list[0].value,tempOidData);
[解决办法]
sprintf你直接这么用呢?
char tmpbuf[4096];
memset(tmpbuf,0,sizeof(tmpbuf));
sprintf(tmpbuf, "%s ",any-> asnValue.string.stream);
strbuf=(String)tmpbuf;
另外,char * string = NULL;
如果该指针指向的是一个已经分配了空间的则没问题,但是如果没有分配就是用就是大问题
[解决办法]
这段程序看上去没什么问题,会不会是其它地方有内存泄露引起的,你的bcb6打补丁了吗(因为也可能是bcb6本身的bug引起的)
另外,试试用AnsiString 的printf()代替sprintf().它们的用法相同,只是返回值不同
你还可试试VCL的Format
strbuf=Format( "%d ", ARRAYOFCONST((any-> asnValue.number)));
[解决办法]
1.printf()与sprintf()都是AnsiString的格式化赋值函数,只是返回值不同
printf()返回的是输出到String中的字符数
sprintf()返回的是String本身(*this)
如:
String x;
int y=x.printf( "%d ",111); //y=3
String z=x.printf( "%d ",111); //z=x;
一般情况下,我只用printf
2.BCB的Format的确难用,它是VCL的函数,为与delphi兼容而设的,一般没必要用(BCB的String::printf就等同于VC的CString的Format)
3.SNMP编程我不熟,有非正常字符要看你ASN_OCTETSTRING对应执行了那个case
像:
strbuf = dumpOctStr((void*)any-> asnValue.arbitrary.stream,...
可能会返回非打印字符的