Форум программистов, компьютерный форум CyberForum.ru

Первое С++ приложение - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 8, средняя оценка - 4.75
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
04.09.2013, 18:06     Первое С++ приложение #1
Добрый день, господа!
Я бы был крайне благодарен, если бы меня профилактически попинали ногами (виртуально, конечно).
Это моё первое (не из книжки) приложение на С++, поэтому море грубых, глупых и непростительных ошибок прилагается.
Суть - класс и пара функций для получения int значения из OID по SMNP. Используется Winsnmp на Win7, Code::Blocks, gcc.

Кликните здесь для просмотра всего текста

Хедер
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#ifndef __MAIN_H__
#define __MAIN_H__
 
#include <windows.h>
#include <Winsnmp.h>
class snmpident
{
    char community[50];
    char srcip[50];
    char ip[50];
    char oid[50];
    HSNMP_SESSION sesshandle;
 
 
public:
    snmpident(const char* c, const char* si, const char* i,const char* o);
    ~snmpident();
    void GetSnmpValue();
    int reply;
 
};
int initsnmp();
int cleanupsnmp();
SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd,
        UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData);
 
 
#endif // __MAIN_H__
Библиотека
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
#include <stdio.h>
#include <string.h>
#include "main.h"
#include <process.h>
#include <assert.h>
 
int initsnmp()  //needed to run once, before using class objects
{
unsigned int minver,maxver,ver,trmode,remode;
    if (SnmpStartup(&minver,&maxver,&ver,&trmode,&remode)==SNMPAPI_SUCCESS)
    {
      printf("SnmpStartup success\n");
      return(0);
    } else
    {
      int errcode = SnmpGetLastError(NULL);
      return(errcode);
    }
 
}
 
int cleanupsnmp() //use it when last class obj is deleted
{
    if (SnmpCleanup()==SNMPAPI_SUCCESS)
    {
      printf("SnmpCleanup success\n");
      return(0);
    } else
    {
      int errcode = SnmpGetLastError(NULL);
      return(errcode);
    }
}
 
snmpident::snmpident(const char* c, const char* si, const char* i,const char* o)
{
printf("Class constructor start\n");
strcpy(community,c);//init values
strcpy(ip,i);
strcpy(oid,o);
strcpy(srcip,si);
 
 
if ((sesshandle=SnmpCreateSession(NULL,NULL,snmpgetCB,this))!=SNMPAPI_FAILURE)//create Winsnmp session
{
printf("Winsnmp session created\n");
 
} else {printf("Can't create Winsnmp session\n");}
 
 
}
snmpident::~snmpident()
{
printf("Winsnmp session closed\n");
SnmpClose(sesshandle);
}
 
void snmpident::GetSnmpValue()
{
printf("Entering GetSnmp\n");
 
 if (sesshandle!=SNMPAPI_FAILURE)
 {
 
    LPSTR strSrcAddr = srcip;
    LPSTR strDstAddr = ip;
    UINT32 nDstPort = 161;
    smiINT snmpPduType = SNMP_PDU_GET; //set pdu type
 
    HSNMP_ENTITY snmpDstEntity = SnmpStrToEntity(sesshandle,strDstAddr); //set dest ip
    assert(snmpDstEntity!=SNMPAPI_FAILURE);
 
    HSNMP_ENTITY snmpSrcEntity = SnmpStrToEntity(sesshandle,strSrcAddr); //set source ip
    assert(snmpSrcEntity!=SNMPAPI_FAILURE);
 
    SnmpSetPort(snmpDstEntity, nDstPort);
 
 
    int j=0;
    for (int i=0;i<50;i++)
    {
        if (community[i]==0)
            {
                j=i;
                break;
            }
    }
    smiOCTETS snmpCtxOctects = {j, (smiLPBYTE)community};
    delete &j;
    HSNMP_CONTEXT snmpCtxt = SnmpStrToContext(sesshandle, &snmpCtxOctects); //set community
    assert(snmpCtxt!=SNMPAPI_FAILURE);
 
    smiVALUE tSmiVal;
    tSmiVal.syntax = SNMP_SYNTAX_INT;
    tSmiVal.value.sNumber = 1;
    smiOID oidstruct;
    SnmpStrToOid(oid,&oidstruct);
    HSNMP_VBL snmpVarBindList = SnmpCreateVbl(sesshandle,&oidstruct,&tSmiVal); //set oid
    assert(snmpVarBindList != SNMPAPI_FAILURE);
 
    HSNMP_PDU snmpPdu = SnmpCreatePdu(sesshandle, snmpPduType, 1001, 1002, 1003, snmpVarBindList);//set pdu
    assert(snmpPdu != SNMPAPI_FAILURE);
 
    if (SnmpSendMsg(sesshandle,snmpSrcEntity,snmpDstEntity,snmpCtxt,snmpPdu)==SNMPAPI_FAILURE)//send pdu
    printf("Message sending failed\n"); else
    printf("Message sent\n");
 
 
    SnmpFreePdu(snmpPdu);
    SnmpFreeVbl(snmpVarBindList);                                 //cleaning up
    SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&oidstruct);
    SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&tSmiVal);
    SnmpFreeContext(snmpCtxt);
    SnmpFreeEntity(snmpSrcEntity);
    SnmpFreeEntity(snmpDstEntity);
 
 
 }
 return;
}
 
SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd,  //callback recv func
        UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData)
{
 if (wParam==0){ //is message
 printf("Message received\n");
HANDLE rsrcEntity;
HANDLE rdstEntity;
HANDLE rcontext;
HANDLE rPDU;    //handles for SnmpRecvMsg func
while (SnmpRecvMsg(hSession,&rsrcEntity, &rdstEntity, &rcontext, &rPDU)==SNMPAPI_SUCCESS)//getting msg
  {
printf("Message processed\n");
HSNMP_VBL snmpVarBindList;  //vbl handle
    if (SnmpGetPduData(rPDU,NULL,NULL,NULL,NULL,&snmpVarBindList)!=SNMPAPI_FAILURE) //pdu to vbl (handles)
    {
        smiVALUE sv; //vbl members init
        smiOID so;
        printf("Getting pdu\n");
        if (SnmpGetVb(snmpVarBindList,1,&so,&sv)!=SNMPAPI_FAILURE) //vbl handle to values
        {
           printf("Getting vbl\n");
            if (sv.syntax==SNMP_SYNTAX_INT) //integer only
            {
                printf("Integer value. Proceeding\n");
                printf("Value:%d",sv.value.sNumber); //print int value
                printf("\n");
                if (lpClientData!=NULL)
                reinterpret_cast<snmpident*>(lpClientData)->reply=sv.value.sNumber;
 
            } else {printf("Non-integer value\n");} //not integer
        } else {printf("Getting vbl failed\n");}
                SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&so);//clean
                SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&sv);
    } else {printf("Pdu getting failed\n");
             SNMPAPI_STATUS errstat = SnmpGetLastError(hSession);
             printf("Error:%d",errstat);
    }
    SnmpFreeVbl(snmpVarBindList);
 
  }
 
    SnmpFreePdu(rPDU);
    SnmpFreeContext(rcontext);
    SnmpFreeEntity(rdstEntity);
    SnmpFreeEntity(rsrcEntity);
 
 }
return(SNMPAPI_SUCCESS); //ret success
}
ВЫЗОВ
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
unsigned int WINAPI WorkerFunc(LPVOID pParam)
{
 
printf("Thread start\n");
if (initsnmp()!=0)//winsnmp init
{
    printf("Can't init Winsnmp\n");
    exit(1); //if failed, then terminate
}
 
{
 
snmpident si("SWn25hTz","192.168.0.25","192.168.0.99","1.3.6.1.4.1.25728.8400.2.4.0");//fill class with values
si.GetSnmpValue();
Sleep(1000);
char tmp[20];
itoa(si.reply,tmp,10);
MessageBox(NULL,tmp,"msg",MB_OK);
}
 
 
if (cleanupsnmp()!=0)//winsnmp cleanup
{
  printf("Winsnmp cleanup failed!\n");
}//no falture exit
printf("Thread stop\n");
_endthreadex(0);//stop worker thread
}

Отдельное спасибо дочитавшим!
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
04.09.2013, 18:06     Первое С++ приложение
Посмотрите здесь:

C++ Моё Первое Оконное приложение!
C++ Задача первое большее a
Первое вхождение 2-го массива в 1-ый C++
Вывести первое слово!с++ C++
C++ Первое приложение под виндовс
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
04.09.2013, 18:30     Первое С++ приложение #2
Цитата Сообщение от SilentHunt Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
int initsnmp() *//needed to run once, before using class objects
{
unsigned int minver,maxver,ver,trmode,remode;
 if (SnmpStartup(&minver,&maxver,&ver,&trmode,&remode)==SNMPAPI_SUCCESS)
 {
 printf("SnmpStartup success\n");
 return(0);
 } else
 {
 int errcode = SnmpGetLastError(NULL);
 return(errcode);
 }
}
для начала избався от подобного мусора
C++
1
2
3
4
5
6
7
8
9
10
11
int initsnmp() *//needed to run once, before using class objects
{
    unsigned int minver,maxver,ver,trmode,remode;
    if (SnmpStartup(&minver, &maxver, &ver, &trmode, &remode) == SNMPAPI_SUCCESS)
    {
        printf("SnmpStartup success\n");
        return 0;
    }
 
    return SnmpGetLastError(NULL);
}
Цитата Сообщение от SilentHunt Посмотреть сообщение
void snmpident::GetSnmpValue()
и перепиши каждую функцию/метод чтоб в ней было 20 строк максимум
Бендерродригез
05.09.2013, 10:19
  #3

Не по теме:

Цитата Сообщение от Jupiter Посмотреть сообщение
и перепиши каждую функцию/метод чтоб в ней было 20 строк максимум
Всегда интересовал этот вопрос: а что делать, скажем, со switch? Каким макаром уменьшить функцию, если в switch`е хотя бы 30 вариантов?

h_wolf
05.09.2013, 10:27
  #4

Не по теме:

Цитата Сообщение от Бендерродригез Посмотреть сообщение

Не по теме:

Всегда интересовал этот вопрос: а что делать, скажем, со switch? Каким макаром уменьшить функцию, если в switch`е хотя бы 30 вариантов?

Присоединяюсь к вопросу.

Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.09.2013, 10:51     Первое С++ приложение #5
Бендерродригез, заменить switch таблицей
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
05.09.2013, 10:52     Первое С++ приложение #6
Цитата Сообщение от SilentHunt Посмотреть сообщение
Я бы был крайне благодарен, если бы меня профилактически попинали ногами (виртуально, конечно).
У меня замечаний нет. Все вроде правильно сделал, не к чему придраться!!! Пятерка тебе!!!!
Бендерродригез
Сгибальщик
 Аватар для Бендерродригез
42 / 42 / 3
Регистрация: 18.05.2013
Сообщений: 220
Завершенные тесты: 1
05.09.2013, 10:52     Первое С++ приложение #7
Цитата Сообщение от Jupiter Посмотреть сообщение
таблицей
А можно здесь поподробней?
ninja2
 Аватар для ninja2
230 / 186 / 7
Регистрация: 26.09.2012
Сообщений: 2,018
Завершенные тесты: 1
05.09.2013, 10:55     Первое С++ приложение #8
Цитата Сообщение от Бендерродригез Посмотреть сообщение
А можно здесь поподробней?
Он имел введу контейнет map.

Я думаю не стоит гнаться за маленькими методами, делай какие получаются, нужно смотреть что бы удобно было. Некоторые методы бывают и на 1к строк, просто их разделить не реально.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
05.09.2013, 11:04     Первое С++ приложение #9
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Цитата Сообщение от Бендерродригез Посмотреть сообщение
А можно здесь поподробней?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
void f0();
void f1();
void f2();
void f3();
...
//switch
void foo(int arg)
{
    switch (arg)
    {
    case 0: f0(); break;
    case 1: f1(); break;
    case 2: f2(); break;
    case 3: f3(); break;
    ...
    }
}
 
//table
void foo(int arg)
{
    typedef void (*func_t)();
    func_t f[] = { f0, f1, f2, f3,... };
    f[arg]();
}
в общем же случае, когда ветки case с непоследовательными значениями вместо обычного массива используем ассоциативный массив
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
05.09.2013, 12:28     Первое С++ приложение #10
SilentHunt, если ты в классе не ставишь идентификатор public или private то по умолчанию у тебя данные закрыты (private), но все же для большей ясности лучше ставить идентификатор private.

Ну и как верно заметил господин Жупитер, надо уменьшать функции методы до 20 строк.
salam
157 / 138 / 11
Регистрация: 10.07.2012
Сообщений: 709
05.09.2013, 18:13     Первое С++ приложение #11
Цитата Сообщение от VLK Посмотреть сообщение
Ну и как верно заметил господин Жупитер
я бы после такого упоминания завел себе новый профиль на сайте...
VLK
 Аватар для VLK
192 / 161 / 12
Регистрация: 05.05.2013
Сообщений: 1,221
05.09.2013, 18:46     Первое С++ приложение #12
Цитата Сообщение от salam Посмотреть сообщение
я бы после такого упоминания завел себе новый профиль на сайте...
Почему?
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
06.09.2013, 15:12  [ТС]     Первое С++ приложение #13
Прошу прощения за задержку - добрался до кода только сегодня.
Спасибо всем за замечания и пожелания!
Класс я немного переработал, добавив статическую переменную objcount для выполнения вызовов SnmpStartup() и SnmpCleanup().
Также был уменьшен размер методов, перенесены в конструктор функции, отвечающие за наполнение VarBindList и PDU, вынесен в подстановочную ф-ю цикл определения размера NULL terminated строки.
Код прилагается.
Хэдер

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
#ifndef __MAIN_H__
#define __MAIN_H__
 
#include <windows.h>
#include <Winsnmp.h>
class snmpident
{
    char community[50];
    char srcip[50];
    char ip[50];
    char oid[50];
    static int objcount;//счетчик экземпляров
    //winapi handle
    HSNMP_SESSION sesshandle;
    HSNMP_ENTITY snmpDstEntity;
    HSNMP_ENTITY snmpSrcEntity;
    HSNMP_CONTEXT snmpCtxt;
    HSNMP_PDU snmpPdu;
    HSNMP_VBL snmpVarBindList;
    //winapi handle
    int initsnmp();
    int cleanupsnmp();
    int inline communitysize();
    void initsnmpvals();
    void freesnmpvals();
    int createpdu();
public:
    snmpident(const char* c, const char* si, const char* i,const char* o);
    ~snmpident();
    int GetSnmpValue();
    int reply;
};
int snmpident::objcount=0;
SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd,
        UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData);
 
#endif // __MAIN_H__

Библиотека

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
#include <stdio.h>
#include <string.h>
#include "main.h"
#include <process.h>
#include <assert.h>
 
int snmpident::initsnmp()
{
printf("initsnmp\n");
unsigned int minver,maxver,ver,trmode,remode;
    if (SnmpStartup(&minver,&maxver,&ver,&trmode,&remode)==SNMPAPI_SUCCESS)
        return(0);else return(1);
}
 
int snmpident::cleanupsnmp()
{
printf("cleanupsnmp\n");
    if (SnmpCleanup()==SNMPAPI_SUCCESS)
        return(0);else return(1);
}
 
snmpident::snmpident(const char* c, const char* si, const char* i,const char* o)
{
printf("construction\n");
strcpy(community,c);//init values
strcpy(ip,i);
strcpy(oid,o);
strcpy(srcip,si);
if (objcount==0)
{
    int j=initsnmp();
    assert(j==0);
}
objcount++;
sesshandle=SnmpCreateSession(NULL,NULL,snmpgetCB,this);//create Winsnmp session
initsnmpvals();
createpdu();
}
 
 
snmpident::~snmpident()
{
printf("destruction\n");
freesnmpvals();
SnmpClose(sesshandle);
objcount--;
if (objcount==0)
{
    int j=cleanupsnmp();
    assert(j==0);
}
}
 
int snmpident::GetSnmpValue()
{
if (sesshandle!=SNMPAPI_FAILURE)
{
printf("getsnmpvalue\n");
SNMPAPI_STATUS Status=SNMPAPI_FAILURE;
    Status = SnmpSendMsg(sesshandle,snmpSrcEntity,snmpDstEntity,snmpCtxt,snmpPdu);//send pdu
 if (Status==SNMPAPI_SUCCESS)
 {
     printf("msg sent\n");
     return(0);
 }
    else
 {
    Status = SnmpGetLastError(sesshandle);
    printf("Error:%d",Status);
    printf("\n");
    return(Status);
 }
}
}
 
int inline snmpident::communitysize()
{
printf("communitysize\n");
    for (int i=0;i<50;i++)
    {
        if (community[i]==0)
                return i;
    }
}
 
void snmpident::initsnmpvals()
{
printf("initsnmpvals\n");
        snmpDstEntity = SnmpStrToEntity(sesshandle,ip); //set dest ip
    assert(snmpDstEntity!=SNMPAPI_FAILURE);
        snmpSrcEntity = SnmpStrToEntity(sesshandle,srcip); //set source ip
    assert(snmpSrcEntity!=SNMPAPI_FAILURE);
    smiOCTETS snmpCtxOctects = {communitysize(), (smiLPBYTE)community};
        snmpCtxt = SnmpStrToContext(sesshandle, &snmpCtxOctects); //set community
    SnmpFreeDescriptor(SNMP_SYNTAX_OCTETS,&snmpCtxOctects);
    assert(snmpCtxt!=SNMPAPI_FAILURE);
 
}
 
int snmpident::createpdu()
{
printf("createpdu\n");
    smiINT snmpPduType = SNMP_PDU_GET; //set pdu type
    smiVALUE tSmiVal;
    tSmiVal.syntax = SNMP_SYNTAX_INT;
    tSmiVal.value.sNumber = 1;
    smiOID oidstruct;
    SnmpStrToOid(oid,&oidstruct);
        snmpVarBindList = SnmpCreateVbl(sesshandle,&oidstruct,&tSmiVal); //set oid
            SnmpFreeDescriptor(tSmiVal.syntax,(smiLPOPAQUE)&tSmiVal.value.sNumber);
            SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&oidstruct);
    assert(snmpVarBindList != SNMPAPI_FAILURE);
        snmpPdu = SnmpCreatePdu(sesshandle, snmpPduType, NULL, NULL, NULL, snmpVarBindList);//set pdu
    assert(snmpPdu != SNMPAPI_FAILURE);
    return(0);
}
 
 
void snmpident::freesnmpvals()
{
printf("freesnmpvals\n");
    SnmpFreeVbl(snmpVarBindList);
    SnmpFreePdu(snmpPdu);
    SnmpFreeContext(snmpCtxt);
    SnmpFreeEntity(snmpSrcEntity);
    SnmpFreeEntity(snmpDstEntity);
}
 
 
 
SNMPAPI_STATUS CALLBACK snmpgetCB(HSNMP_SESSION hSession,HWND hWnd,  //callback recv func
        UINT wMsg,WPARAM wParam,LPARAM lParam,LPVOID lpClientData)
{
 if (wParam==0)//is message
 {
    HANDLE rsrcEntity,rdstEntity,rcontext,rPDU;//handles for SnmpRecvMsg func
while (SnmpRecvMsg(hSession,&rsrcEntity, &rdstEntity, &rcontext, &rPDU)==SNMPAPI_SUCCESS)//getting msg
  {
    HSNMP_VBL snmpVarBindList;  //vbl handle
        if (SnmpGetPduData(rPDU,NULL,NULL,NULL,NULL,&snmpVarBindList)!=SNMPAPI_FAILURE)//pdu to vbl (handles)
    {
        smiVALUE sv; //vbl members init
        smiOID so;
            if ((SnmpGetVb(snmpVarBindList,1,&so,&sv)!=SNMPAPI_FAILURE) //vbl handle to values
            &&(sv.syntax==SNMP_SYNTAX_INT)//integer only
            && (lpClientData!=NULL))
                reinterpret_cast<snmpident*>(lpClientData)->reply=sv.value.sNumber;
            SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&so);//clean
            SnmpFreeDescriptor(SNMP_SYNTAX_OID,(smiLPOPAQUE)&sv);
    }
    SnmpFreeVbl(snmpVarBindList);
  }
    SnmpFreePdu(rPDU);
    SnmpFreeContext(rcontext);
    SnmpFreeEntity(rdstEntity);
    SnmpFreeEntity(rsrcEntity);
 }
return(SNMPAPI_SUCCESS); //ret success
}

Вызов изменений не претерпел.
Jupiter
Каратель
Эксперт C++
6542 / 3962 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
06.09.2013, 15:20     Первое С++ приложение #14
SilentHunt, вы таки не поняли
Цитата Сообщение от SilentHunt Посмотреть сообщение
C++
1
2
3
4
5
6
7
8
9
10
11
12
if (Status==SNMPAPI_SUCCESS)
 {
     printf("msg sent\n");
     return(0);
 }
    else
 {
    Status = SnmpGetLastError(sesshandle);
    printf("Error:%d",Status);
    printf("\n");
    return(Status);
 }
подумайте ещё раз, для чего тут ветка else?

Добавлено через 1 минуту
Цитата Сообщение от SilentHunt Посмотреть сообщение
C++
1
2
3
int snmpident::GetSnmpValue()
{
if (sesshandle!=SNMPAPI_FAILURE)
что вернет этот метод если условие в if не выполнится?
SilentHunt
1 / 1 / 0
Регистрация: 30.01.2013
Сообщений: 13
06.09.2013, 17:59  [ТС]     Первое С++ приложение #15
Согласен, в окончательном варианте класса она не нужна, я использовал "else" для отлова ошибок, присылаемых SnmpSendMsg.
Хотя там "else" в принципе не нужен, уловил.
Цитата Сообщение от Jupiter Посмотреть сообщение
что вернет этот метод если условие в if не выполнится?
Пардон, невнимательность.

C++
1
2
3
4
5
6
7
8
9
10
11
int snmpident::GetSnmpValue()
{
if (sesshandle!=SNMPAPI_FAILURE)
{
SNMPAPI_STATUS Status=SNMPAPI_FAILURE;
    Status = SnmpSendMsg(sesshandle,snmpSrcEntity,snmpDstEntity,snmpCtxt,snmpPdu);//send pdu
 if (Status==SNMPAPI_SUCCESS) return(0);
return(1);
}
return(1);
}
Добавлено через 10 минут
C++
1
2
3
4
if ((sesshandle!=SNMPAPI_FAILURE)
&& (SnmpSendMsg(sesshandle,snmpSrcEntity,snmpDstEntity,snmpCtxt,snmpPdu)==SNMPAPI_SUCCESS))
 return(0);
 return(1);
Вот, так лучше.

Добавлено через 1 час 50 минут
Позвольте ещё вопрос:
когда я тыкаюсь из CALLBACK функции в reinterpret_cast<snmpident*>(lpClientData)->reply=sv.value.sNumber;, у меня есть все шансы попасть в уже удаленный объект. Как быть?
Qwertiy
817 / 625 / 75
Регистрация: 20.08.2013
Сообщений: 2,525
07.09.2013, 01:58     Первое С++ приложение #16
Не надо считать сложность функции строками. Это бред.

Добавлено через 1 минуту
Код стоит форматировать лучше... Или включить автоматическое форматирование (хотя лично я за ручное для Си/Си++ особенно).

Добавлено через 1 минуту
Ставить возвращаемое значение в скобки имеет только в том случаее, когда это нужно для использования макроса перед возвратом значения.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
07.09.2013, 02:55     Первое С++ приложение
Еще ссылки по теме:

Мое первое приложение. Начало. Любые компетентные советы C++
C++ Пропускает первое значение
Удалить первое слово C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
Hugra
 Аватар для Hugra
47 / 47 / 1
Регистрация: 18.07.2013
Сообщений: 138
Записей в блоге: 1
07.09.2013, 02:55     Первое С++ приложение #17
А что делает данное приложение? =)
Yandex
Объявления
07.09.2013, 02:55     Первое С++ приложение
Ответ Создать тему
Опции темы

Текущее время: 20:53. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru