powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SnmpRecvMsg function did not complete successfully because all output parameters are NULL
23 сообщений из 48, страница 2 из 2
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729621
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНе торопись и переведи фразу
Да послал он этот запрос, послал...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729698
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Мужики, хорош стебаться
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731361
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

С подачи приятеля установил WireShark - запрос у устройству не уходит. Странно, что SnmpSendMsg завершается без ошибок...

Программа, использующая синхронные запросы отрабатывает успешно.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731668
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Состав сообщения, посылаемого моей программой
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731672
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Состав сообщения, посылаемого миб-браузером

Отличие только в request-id
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731685
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я же говорил, что проблема не в отправке, а в приёме. И даже цитату привёл как надо делать
правильно.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731747
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Дмитрий, если вам нетрудно, могли бы вы пояснить, почему WireShark не видит ответа? Мне представляется, что если я не считываю ответ, он всё равно должен прийти. Нет?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731775
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ioscat,

HSNMP_ENTITY srcEntity = SnmpStrToEntity(hSession,"172.30.1.180");
HSNMP_ENTITY dstEntity = SnmpStrToEntity(hSession,"173.30.1.18");

Ошибка в IPшнике была
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731790
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatМне представляется, что если я не считываю ответ, он всё равно должен прийти.
Нет?
Твоя программа завершается раньше, чем ответ успевает прийти. При этом скорее всего
соединение рвётся и ответу просто некуда приходить. Поэтому его и не присылают. Смотри
полный список проходящих пакетов, возможно между ними затесался RST.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731805
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

Дмитрий, если вкратце:

В WireShark стоит фильтр отображения только пакетов SNMP. Таки образом видно, что ответ браузеру приходит, а моей программе - нет. это было вызвано ошибкой в IP. Как только я её исправил, проблема пропала, я вижу ответ.

Программа не могла завершаться раньше прихода ответа, потому что ответ приходит очень быстро, а моя программа работает около секунды. Она в цикле много раз выполняет SnmpRecvMsg. Как только я увеличил TimeOut, она получила ответ на первой же итерации. Я думаю, что это идейно неверный подход, потому что, насколько понимаю я, нужно запускать SnmpRecvMsg иначе, и теперь я постараюсь разобраться, как.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731808
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovioscatМне представляется, что если я не считываю ответ, он всё равно должен прийти.
Нет?
Твоя программа завершается раньше, чем ответ успевает прийти. При этом скорее всего
соединение рвётся и ответу просто некуда приходить. Поэтому его и не присылают. Смотри
полный список проходящих пакетов, возможно между ними затесался RST.
Неверно.
У него программа завершается раньше чем запрос успевает уйти.
И зря ты путаешь человека. Тот кусок документации что ты привел это всего-лишь одно из решений. Можно жить и без WndProc, почти так как показал ТС в своем неработающем коде. Вариант с колбеками прекрасно может работать если только догадаться чем этот колбек должен заниматься вместо писков.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731828
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlУ него программа завершается раньше чем запрос успевает уйти.
Это как так?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38731839
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlИ зря ты путаешь человека. Тот кусок документации что ты привел это
всего-лишь одно из решений. Можно жить и без WndProc
Да. Но для этого надо прочитать доку на SnmpCreateSession(), чего я на тот момент времени
не сделал.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38732066
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
В общем, данные получает, осталось по уму переделать. Попробую разобраться, что вы имели в виду

Код: plaintext
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.
#include <Windows.h>
#include <WinInet.h>
#include <WinSnmp.h>
#include <iostream>
#pragma comment(lib, "WSNMP32.LIB")
using namespace std;


SNMPAPI_STATUS CALLBACK fCallback(HSNMP_SESSION hSession, HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam, LPVOID lpClientData)
{
	cout << "CallBack beep! \n";
	cout << "CallBack beep! \n";


	LPHSNMP_ENTITY srcEntity = new HSNMP_ENTITY;
	LPHSNMP_ENTITY dstEntity = new HSNMP_ENTITY;
	LPHSNMP_CONTEXT context = new HSNMP_CONTEXT;
	LPHSNMP_PDU PDU = new HSNMP_PDU;

	cout << "CallBack: Recieve: " << SnmpRecvMsg ( hSession, srcEntity, dstEntity, context, PDU) << "\n";
	cout << "CallBack: SnmpGetLastError: " << SnmpGetLastError(NULL) << "\n";

	smiLPINT PDU_type = new smiINT ;
	smiLPINT32 request_id = new smiINT32;
	smiLPINT error_status = new smiINT ;
	smiLPINT error_index = new smiINT ;
	LPHSNMP_VBL varbindlist = new HSNMP_VBL;

	cout << "CallBack: SnmpGetPduData: " << SnmpGetPduData ( *PDU, PDU_type, request_id, error_status, error_index, varbindlist) << "\n";
	cout << "CallBack: SnmpGetLastError: " << SnmpGetLastError(NULL) << "\n";


	//HSNMP_VBL vbl'
	smiUINT32 index = 1;

	smiLPOID name = new smiOID;
	smiLPVALUE value = new smiVALUE;

	cout << "CallBack: SnmpGetVb: " << SnmpGetVb (*varbindlist,index,name,value) << "\n";
	cout << "CallBack: SnmpGetLastError: " << SnmpGetLastError(NULL) << "\n";

	cout << "CallBack: value->value.sNumber: " << value->value.sNumber << "\n";

	return SNMPAPI_SUCCESS;
}

int main()
{
	cout << "Start \n";

	smiLPUINT32 nMajorVersion = 0;
	smiLPUINT32 nMinorVersion = 0;
	smiLPUINT32 nLevel = 0;
	smiLPUINT32 nTranslateMode = 0;
	smiLPUINT32 nRetransmitMode = 0;
	cout << "SnmpStartup: " << SnmpStartup (  nMajorVersion, nMinorVersion, nLevel, nTranslateMode, nRetransmitMode) << "\n";
	/*
	cout << "nMajorVersion: " << nMajorVersion << "\n";
	cout << "nMinorVersion: " << nMinorVersion << "\n";
	cout << "nLevel: " << nLevel << "\n";
	cout << "nTranslateMode: " << nTranslateMode << "\n";
	cout << "nRetransmitMode: " << nRetransmitMode << "\n";
	*/
	cout << "\n";

	//SnmpSetTranslateMode (SNMPAPI_UNTRANSLATED_V1);
	//cout << "SnmpSetTranslateMode: " << SnmpSetTranslateMode(SNMPAPI_UNTRANSLATED_V2) << "\n";
	//cout << "SnmpSetRetransmitMode: " << SnmpSetRetransmitMode(SNMPAPI_ON) << "\n";

	HWND hWnd = GetConsoleWindow();
	unsigned int wMsg = 10;
	cout << "wMsg: " << wMsg << "\n";

	SNMPAPI_CALLBACK callback = &fCallback;

	cout << "SnmpCreateSession: " << "\n";
	//HSNMP_SESSION hSession = SnmpCreateSession (0,0,fCallback,NULL);
	HSNMP_SESSION hSession = SnmpCreateSession (hWnd,0,fCallback,NULL);
	//cout << "GetLastError(): " << GetLastError() << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(hSession) << "\n";
	cout << "wMsg: " << wMsg << "\n";

	cout << "SNMPAPI_SUCCESS: " << SNMPAPI_SUCCESS << "\n";
	cout << "SNMPAPI_NOT_INITIALIZED: " << SNMPAPI_NOT_INITIALIZED << "\n";
	cout << "SNMPAPI_OTHER_ERROR: " << SNMPAPI_OTHER_ERROR << "\n";
	cout << "SNMPAPI_NOOP: " << SNMPAPI_NOOP << "\n";
	cout << "SNMPAPI_ALLOC_ERROR: " << SNMPAPI_ALLOC_ERROR << "\n";

	HSNMP_ENTITY srcEntity = SnmpStrToEntity(hSession,"172.31.121.180");
	HSNMP_ENTITY dstEntity = SnmpStrToEntity(hSession,"172.30.1.18");
	cout << "\n";

	// вот этот кусок, как я понимаю, не действует на SnmpRecvMsg, описанный в CallBack
	cout << "SnmpSetTimeout: " << SnmpSetTimeout(dstEntity,10) << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(NULL) << "\n";

	cout << "SnmpSetTimeout: " << SnmpSetRetry(dstEntity,0) << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(NULL) << "\n";

	cout << "SnmpSetPort: " << SnmpSetPort(dstEntity, 161) << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(NULL) << "\n";
	cout << "\n";

	smiOCTETS Context;
	const char *pszCommunity = "public\0";
	
	Context.ptr = (smiLPBYTE)pszCommunity;
	Context.len = lstrlen(pszCommunity);
	HSNMP_CONTEXT hContext = SnmpStrToContext(hSession, &Context);
	cout << "\n";

	smiOID SomeOid;
	cout << "SnmpStrToOid: " << SnmpStrToOid(".1.3.6.1.2.1.1.7.0\0", &SomeOid) << "\n";

	smiVALUE value;
	value.syntax=SNMP_SYNTAX_INT;
	value.value.sNumber=NULL;

	//HSNMP_VBL hVbl = SnmpCreateVbl(hSession, &SomeOid, &value);
	HSNMP_VBL hVbl = SnmpCreateVbl(hSession, &SomeOid, NULL);

	smiINT32 request_id = 12345; // не влияет ни на что
	cout << "SnmpCreateVbl GetLastError: " << SnmpGetLastError(hSession) << "\n";
	HSNMP_PDU hPDU = SnmpCreatePdu(hSession, SNMP_PDU_GET, NULL, NULL, NULL, hVbl);
	cout << "SnmpCreatePdu GetLastError: " << SnmpGetLastError(hSession) << "\n";
	cout << "\n";

	cout << "SnmpSendMsg: " << SnmpSendMsg ( hSession, srcEntity, dstEntity, hContext, hPDU) << "\n";
	cout << "SnmpSendMsg SnmpGetLastError: " << SnmpGetLastError(hSession) << "\n";
	cout << "\n";

	cout << "HaHa1! \n";
	cout << "value.value.sNumber: " << value.value.sNumber << "\n";
	cout << "HaHa3! \n";

	for(int i=0;i<100000000;i++)
	{
		if ((i*10) %100000000 ==0) cout << "HaHa - " << (i*10) /100000000 << "\n";
		i++;i--;
	}

	cout << "End \n";
	return 0;
}

...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38732068
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ВыводStart
SnmpStartup: 1

wMsg: 10
SnmpCreateSession:
SnmpGetLastError: 1
wMsg: 10
SNMPAPI_NOT_INITIALIZED: 18
SNMPAPI_OTHER_ERROR: 99
SNMPAPI_NOOP: 8
SNMPAPI_ALLOC_ERROR: 2

SnmpSetTimeout: 1
SnmpGetLastError: 1
SnmpSetTimeout: 1
SnmpGetLastError: 1
SnmpSetPort: 1
SnmpGetLastError: 1


SnmpStrToOid: 9
SnmpCreateVbl GetLastError: 1
SnmpCreatePdu GetLastError: 1

SNMPAPI_SUCCESS: 1

SnmpSendMsg: 1
SnmpSendMsg SnmpGetLastError: 1

HaHa1!
HaHa2!
value.value.sNumber: 0
HaHa3!
HaHa - 0
CallBack beep!
CallBack beep!
CallBack: Recieve: 1
CallBack: SnmpGetLastError: 1
CallBack: SnmpGetPduData: 1
CallBack: SnmpGetLastError: 1
CallBack: SnmpGetVb: 1
CallBack: SnmpGetLastError: 1
CallBack: value->value.sNumber: 76
HaHa - 1
HaHa - 2
HaHa - 3
HaHa - 4
HaHa - 5
HaHa - 6
HaHa - 7
HaHa - 8
HaHa - 9
End
Для продолжения нажмите любую клавишу . . .
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38732083
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ioscat,
вывод немного не соответствует коду программы, ну и ладно, суть не меняется
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38732573
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl, Dimitry Sibiryakov, MasterZiv,

Правильно ли я понимаю, что для корректной работы функция SnmpRecvMsg должна запускаться только тогда, когда приходит ответная посылка от опрашиваемого устройства? И для этого и нужна SNMPAPI callback function ?
MSDNThe Microsoft WinSNMP implementation calls the SNMPAPI_CALLBACK function to notify a WinSNMP session that an SNMP message or asynchronous event is availableПравильно ли помещать SnmpRecvMsg в описании функции fCallback ? Можно ли вернуть в main полученные значения?
Возможно ли в функцию fCallback передать дополнительные значения?
В моей текущей реализации код функции main продолжает выполняться параллельно с fCallback , при этом пока я поставил костыль (цикл), искусственно продолжающий работу программы, чтобы получить ответ от устройства. Можно ли как-то в рамках консольного приложения отложить завершение программы до выполнения fCallback ?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38733241
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatWhite Owl, Dimitry Sibiryakov, MasterZiv,

Правильно ли я понимаю, что для корректной работы функция SnmpRecvMsg должна запускаться только тогда, когда приходит ответная посылка от опрашиваемого устройства? И для этого и нужна SNMPAPI callback function ?Ну где-то так... плюс-минус.
Читай внимательно описание SnmpCreateSession. Там даны два разных способа работы. Один основан на WndProc, второй на простом колбеке. Если у тебя есть окошко, то есть и WndProc, который является универсальным колбеком для всех событий. А можно сделать простой колбек который будет срабатывать только на Snmp события. Тогда окошки не нужны или можно сделать параллельно два колбека, один для оконных событий, другой только для SNMP.

ioscatВозможно ли в функцию fCallback передать дополнительные значения?Да. Смотри последний параметр.

ioscatВ моей текущей реализации код функции main продолжает выполняться параллельно с fCallback , при этом пока я поставил костыль (цикл), искусственно продолжающий работу программы, чтобы получить ответ от устройства. Можно ли как-то в рамках консольного приложения отложить завершение программы до выполнения fCallback ?Ничего параллельного там нет. Для параллельности нужны потоки (или процессы), а колбек это чисто последовательное выполнение.
И да, конечно можно "заснуть до срабатывания".
Либо делаешь флаг на основе глобальной переменной и периодически засыпаешь-проверяешь-засыпаешь-проверяешь. Самый примитивный метод.
Либо делаешь мютекс и засыпаешь пока он не дернется, а в колбеке уже собственно дергаешь этот мютекс. Это уже чаще используется в много-потоковых программах, но можно и в одно-потоковой.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38733286
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

спасибо за подробный ответ
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38733290
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНичего параллельного там нет. Для параллельности нужны потоки (или процессы), а колбек это чисто последовательное выполнение.
И да, конечно можно "заснуть до срабатывания".
Либо делаешь флаг на основе глобальной переменной и периодически засыпаешь-проверяешь-засыпаешь-проверяешь. Самый примитивный метод.
Либо делаешь мютекс и засыпаешь пока он не дернется, а в колбеке уже собственно дергаешь этот мютекс. Это уже чаще используется в много-потоковых программах, но можно и в одно-потоковой.

Сов, а как оно будет вызывать callback, если оно висит в ожидании мьютекса, а ?

Тогда надо отдельный поток ещё делать, вызывающий эту всё хрень, в котором будет вызвыаться callback.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38734044
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White OwlioscatВозможно ли в функцию fCallback передать дополнительные значения?Да. Смотри последний параметр.
мы передаём черетырёхбайтный указатель на нечто, а потом говорим, что это указатель на переменную/структуру?

Есть переменная
int a=0;

В CallBack передаём указатель
..., (void*)&a)

Внутри CallBack интерпретируем указатель void как нам нужно (в данном случае int)
(int*)lpClientData

А если передавали структуру, что (struct*)a->member1... etc

Верно?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38734454
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatWhite Owlпропущено...
Да. Смотри последний параметр.
мы передаём черетырёхбайтный указатель на нечто, а потом говорим, что это указатель на переменную/структуру?Нет. Мы передаем "четырехбайтное нечто". А потом каждый раз при вызове колбека, вызывающая система отдает это "нечто" в колбек.

Это не обязательно будет указатель. Это может быть и целое, и трехбуквенная строка, и естественно это может быть указателем на переменную любого типа и любой комплексности.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38744335
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
...
Рейтинг: 0 / 0
23 сообщений из 48, страница 2 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / SnmpRecvMsg function did not complete successfully because all output parameters are NULL
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]