Как на CW10 работать с SNMP ? (или вообще с сетью)
Добавлено: 27 Сентябрь 2015, 20:04
				
				Начал делать SNMP.SET и .... понял что ничего не понимаю в виндовом API  (собственно я все на чистом СИ и под никсы)
подскажите а то я в запутался в этой типизации
вот начал делать процедуру:
вот тут надо вставить вставку данных которые мы хотим передать в SNMP SET-е
VarTmp имеет тип VariableBindings
они соответственно представлены
и что-то я в этой типизации запутался
те надо указать ASN тип значения и само значение
вопрос - как ?
далее идет этот код - передача и получение результата
			подскажите а то я в запутался в этой типизации
вот начал делать процедуру:
Код: Выделить всё
! Descr  - описание OIDa
! Oid    - сама строка OIDa
! Res - указатель на очередь куда складывать результат
! NewValue - новое значение параметра
! данная очередь имеет тип  SNMPResultQueueType
GetSNMPClass.Set PROCEDURE(LONG DescrID, SHORT Cnv, STRING Descr, STRING Oid, *SNMPResultQueueType Res, STRING NewValue, STRING ASNtypeNewValue)
VarTmp           &RFC1157VarBind
LocIdx  LONG
LocStr  CSTRING(201)
  CODE
  IF SELF.session = 0 THEN RETURN.
  SELF.DescrID = clip(DescrId)
  SELF.requestType = SNMP_PDU_SET
  SELF.Result &= Res
  SELF.Oid   = clip(Oid)
  SELF.Cnv   = Cnv
  SELF.NameOID = clip(Descr)
  ! форматируем OID из строки в OID ASN-формата
  IF SnmpMgrStrToOid(SELF.Oid, SELF.reqObject) = 0
    !SaveLog('snmp','SnmpMgrStrToOid Error: Invalid oid: ' & oid)
    RETURN
  END
  ! выделение памяти под структуру запроса
  SELF.variableBindings.len = 1
  SELF.variableBindings.list = SnmpUtilMemAlloc(size(RFC1157VarBind))
  IF SELF.variableBindings.list = 0
    !SaveLog('snmp','Error: Error allocating oid')
    RETURN
  END
  
    ! готовим структуру для копирования в структуру запроса
  VarTmp &= SELF.variableBindings.list+0
  VarTmp.name = SELF.reqObject
  VarTmp имеет тип VariableBindings
Код: Выделить всё
VariableBindings           GROUP(RFC1157VarBindList).
RFC1157VarBindList              GROUP(SnmpVarBindList),TYPE.
RFC1157VarBind                  GROUP(SnmpVarBind),TYPE.
Код: Выделить всё
SnmpVarBindList          GROUP,TYPE
list                       LONG !GROUP(SnmpVarBind).
len                        ULONG
                         END
SnmpVarBind              GROUP,TYPE
name                       GROUP(AsnObjectName).
value                      GROUP(AsnObjectSyntax).
                         END
                         
AsnObjectName            GROUP(AsnObjectIdentifier),TYPE.
AsnObjectSyntax          GROUP(AsnAny),TYPE.
                         
AsnObjectIdentifier      GROUP,TYPE
idLength                   LONG
ids                        LONG
                         END
                                              
                                              
AsnAny                   GROUP,TYPE
asnType                    BYTE
                           BYTE
                           BYTE
                           BYTE
asnValue                   LONG,DIM(3)
Anynumber                  AsnInteger32,OVER(asnValue)
Anyunsigned32              AsnUnsigned32,OVER(asnValue)
Anycounter64               GROUP(AsnCounter64),OVER(asnValue).
Anystring                  GROUP(AsnOctetString),OVER(asnValue).
Anybits                    GROUP(AsnBits),OVER(asnValue).
Anyobject                  GROUP(AsnObjectIdentifier),OVER(asnValue).
Anysequence                GROUP(AsnSequence),OVER(asnValue).
Anyaddress                 GROUP(AsnIPAddress),OVER(asnValue).
Anycounter                 AsnCounter32,OVER(asnValue)
Anygauge                   AsnGauge32,OVER(asnValue)
Anyticks                   AsnTimeticks,OVER(asnValue)
Anyarbitrary               GROUP(AsnOpaque),OVER(asnValue).
                         END
                                                                                               
те надо указать ASN тип значения и само значение
вопрос - как ?
далее идет этот код - передача и получение результата
Код: Выделить всё
  IF SnmpUtilOidCpy(SELF.rootOid, VarTmp.name ) = 0
    !SaveLog('SNMP','SnmpUtilOidCpy Error ' & GetLastError())
    RETURN
  END
  ! обмен
  LOOP
    IF SnmpMgrRequest(SELF.session, SELF.requestType, SELF.variableBindings, SELF.errorStatus, SELF.errorIndex) = 0
      !SaveLog('snmp','SnmpMgrRequest Error ' & GetLastError())
      BREAK
    END
    if (SELF.errorStatus > 0)
      !SaveLog('snmp','errorStatus ' & SELF.errorStatus)
      !SaveLog('snmp','errorIndex ' & SELF.errorIndex)
      BREAK
    END
    VarTmp &= SELF.variableBindings.list+0
    if (SnmpUtilOidNCmp(VarTmp.name, SELF.rootOid, SELF.rootOid.idLength )) <> 0
      !SaveLog('snmp','SnmpUtilOidNCmp Break')
      BREAK
    END
    SELF.GetVariableBindings
    BREAK
  END
  SnmpUtilMemFree(SELF.variableBindings.list)
  SnmpUtilOidFree(SELF.rootOid)
  RETURN