首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

C++Builder SNMP 编程基本成功,有个Bug,请高手帮忙解决办法

2012-03-09 
C++Builder SNMP 编程基本成功,有个Bug,请高手帮忙C++BuilderSNMP编程基本成功,有个Bug,请高手帮忙是从VC

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,...
可能会返回非打印字符的


热点排行