powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / SnmpRecvMsg function did not complete successfully because all output parameters are NULL
48 сообщений из 48, показаны все 2 страниц
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38726672
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем доброй пятницы.

Пытаюсь написать простое консольное приложение (Visual Studio 2010) для опроса сервера по SNMP. Изначально делал через SNMP.h и функцию SnmpMgrRequest - всё работает. А теперь взял WnSNMP.h (SnmpSendMsg и SnmpRecvMsg) и столкнулся с ошибкой:
Код: 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.
#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";
	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";


	HSNMP_SESSION hSession = SnmpCreateSession (0,0,fCallback,NULL);
		cout << "GetLastError(): " << GetLastError() << "\n";
			cout << "SnmpGetLastError: " << SnmpGetLastError(hSession) << "\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.30.1.180");
		HSNMP_ENTITY dstEntity = SnmpStrToEntity(hSession,"173.30.1.18");
	//HSNMP_ENTITY srcEntity = SnmpStrToEntity(hSession,"172.30.1.18");
	//	HSNMP_ENTITY dstEntity = SnmpStrToEntity(hSession,"173.30.1.180");
	cout << "\n";


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


	smiOID SomeOid;
		SnmpStrToOid(".1.3.6.1.2.1.1.7.0", &SomeOid);
	smiVALUE value;
		value.syntax=SNMP_SYNTAX_INT;
			value.value.sNumber=777;

	HSNMP_VBL hVbl = SnmpCreateVbl(hSession, &SomeOid, &value);
		HSNMP_PDU hPDU = SnmpCreatePdu(hSession, SNMP_PDU_GET, NULL, NULL, NULL, hVbl);

	cout << "\n";


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

	cout << value.value.sNumber << "\n";


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



Ошибка 8 это:
SNMPAPI_NOOP The function did not complete successfully because all output parameters are NULL. The application must specify at least one output parameter that is not NULL when calling a function that returns information to the application.

Что я делаю не так?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38727033
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatЧто я делаю не так?1) Кто тебя учил делать такие лесенки? Открой пожалуйста любую книжку, любой учебник и постарайся привести свой код в традиционный стиль записи. То что есть у тебя сейчас - читать не возможно.
2) Что тебе не понятно из описания ошибки?
3) Открываем документацию на функцию выдавшую ошибку и читаем эту документацию.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38727048
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlКто тебя учил делать такие лесенки?
Такие лесенки получаются сами собой если вставлять текст отступами в VIM с включенным автоотступом :)
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38727050
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyWhite OwlКто тебя учил делать такие лесенки?
Такие лесенки получаются сами собой если вставлять текст отступами в VIM с включенным автоотступом :)На криво-настроенном может быть. На нормальном - ни за что.
Да и вообще, ТС использует мелгомягкий кошмар так что отсылки на VIM не годятся.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38727167
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlНа криво-настроенном может быть. На нормальном - ни за что.
Да и вообще, ТС использует мелгомягкий кошмар так что отсылки на VIM не годятся.
Так может у него криво настроенный VS :)
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38727792
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Anatoly Moskovsky, White Owl,

Спасибо за помощь по теме, но остались ещё некоторые вопросы. Скажите, пожалуйста, если переформатировать отступы, проблема исчезнет? =)

В описании ошибки указано:
MSDNThe function did not complete successfully because all output parameters are NULL. The application must specify at least one output parameter that is not NULL when calling a function that returns information to the application. Вроде все слова русские, буквы понятные, а суть ошибки всё же ускользает, вот я и обращаюсь за советом, в чём проблема?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728150
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatAnatoly Moskovsky, White Owl,

Спасибо за помощь по теме, но остались ещё некоторые вопросы. Скажите, пожалуйста, если переформатировать отступы, проблема исчезнет? =)

В описании ошибки указано:
MSDNThe function did not complete successfully because all output parameters are NULL. The application must specify at least one output parameter that is not NULL when calling a function that returns information to the application. Вроде все слова русские, буквы понятные, а суть ошибки всё же ускользает, вот я и обращаюсь за советом, в чём проблема?


Перевожу.

Код: plaintext
1.
2.
3.
Функция завершилась неуспешно, потому что ВСЕ выходные параметры были указаны как NULL. 
Приложение обязано указать хотя бы один выходной параметр как не NULL при вызове любой функции, которая возвращает информацию приложению.


Т.е. тебе нужно указать хотя бы один выходной параметр как не NULL, дать функции место, куда писать данные.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728235
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
MasterZiv,
//-------------
тут уточнение есть, конкретно к функции SnmpRecvMsg ошибка SnmpApi_NOOP расшифровывается так:
MSDNThe specified session has no messages in its queue at this time.
//-------------
В описании функции SnmpApiRecvMsg указано:
MSDNSNMPAPI_STATUS SnmpRecvMsg(
_In_ HSNMP_SESSION session,
_Out_ LPHSNMP_ENTITY srcEntity,
_Out_ LPHSNMP_ENTITY dstEntity,
_Out_ LPHSNMP_CONTEXT context,
_Out_ LPHSNMP_PDU PDU
);
То есть выходные параметры 1. IP источника запроса, 2. IP устройства, которое мы опрашиваем, 3. контекст, 4. PDU
Из всех нам нужен PDU - в описании ошибки (all outputs are null) имеются в виду эти аутпуты? Но я же их задаю (вроде бы)
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728370
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatAnatoly Moskovsky, White Owl,

Спасибо за помощь по теме, но остались ещё некоторые вопросы. Скажите, пожалуйста, если переформатировать отступы, проблема исчезнет? =)Не сразу.... Но люди смогут прочитать твой код не ломая глаз. А если люди смогут прочитать код, то возможно что и ошибку увидят. А увидят ошибку - подскажут тебе как ее исправить.
А сейчас, нам просто больно смотреть на этот кошмар и пытаться в нем разобраться.

ioscatтут уточнение есть, конкретно к функции SnmpRecvMsg ошибка SnmpApi_NOOP расшифровывается так:
Я вот сейчас себя пересилил и попытался найти где ты вызываешь SnmpRecvMsg. Не нашел.

ioscatВ описании функции SnmpApiRecvMsg указано:Так ты SnmpRecvMsg или SnmpApiRecvMsg используешь?
А вот в коде единственный SNMPAPI_NOOP печатаеся после SnmpCreateSession (вроде бы).

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

Код: 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.
#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";
	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";


	HSNMP_SESSION hSession = SnmpCreateSession (0,0,fCallback,NULL);
	cout << "GetLastError(): " << GetLastError() << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(hSession) << "\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.30.1.180");
	HSNMP_ENTITY dstEntity = SnmpStrToEntity(hSession,"173.30.1.18");
	//HSNMP_ENTITY srcEntity = SnmpStrToEntity(hSession,"172.30.1.18");
	//HSNMP_ENTITY dstEntity = SnmpStrToEntity(hSession,"173.30.1.180");
	cout << "\n";


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


	smiOID SomeOid;
	SnmpStrToOid(".1.3.6.1.2.1.1.7.0", &SomeOid);

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

	HSNMP_VBL hVbl = SnmpCreateVbl(hSession, &SomeOid, &value);
	HSNMP_PDU hPDU = SnmpCreatePdu(hSession, SNMP_PDU_GET, NULL, NULL, NULL, hVbl);

	cout << "\n";


	cout << "SNMPAPI_SUCCESS: " << SNMPAPI_SUCCESS << "\n";
	cout << "GetLastError(): " << GetLastError() << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(hSession) << "\n";

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

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

	cout << value.value.sNumber << "\n";


	cout << "End \n";
	return 0;
}
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728459
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatWhite Owl, хорошо-хорошо, ваше кун-фу сильнее =)Молодец. А теперь скажи в какой строке происходит ошибка?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728473
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Код: plaintext
1.
2.
3.
	cout << "SnmpRecvMsg: " << SnmpRecvMsg ( hSession, &srcEntity, &dstEntity, &hContext, &hPDU) << "\n";
	cout << "GetLastError(): " << GetLastError() << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(hSession) << "\n";



Вот этот блок "проблемный". SnmpRecvMsg завершается с кодом 0 (FAILURE), а SnmpGetLastError() выдаёт SNMPAPI_NOOP
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728533
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatWhite Owl,

Код: plaintext
1.
2.
3.
	cout << "SnmpRecvMsg: " << SnmpRecvMsg ( hSession, &srcEntity, &dstEntity, &hContext, &hPDU) << "\n";
	cout << "GetLastError(): " << GetLastError() << "\n";
	cout << "SnmpGetLastError: " << SnmpGetLastError(hSession) << "\n";



Вот этот блок "проблемный". SnmpRecvMsg завершается с кодом 0 (FAILURE), а SnmpGetLastError() выдаёт SNMPAPI_NOOP
Замечательно. Теперь открой документацию на SnmpRecvMsg и прочитай описание SNMPAPI_NOOP.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38728627
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

MSDNThe specified session has no messages in its queue at this time.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729330
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatWhite Owl,

MSDNThe specified session has no messages in its queue at this time.Перевести это сообщение об ошибке можешь?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729335
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

Конечно.

[quote MSDN]В указанной сессии нет сообщений в очереди на данный момент[\quote]
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729339
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Может быть сообщение ещё не дошло - почему тогда функция завершается?
Может быть ответ вообще не приходит - почему тогда миб-браузеры его получают?

Я думаю, что что-то неверно указано, а вот что...
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729343
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatMSDNВ указанной сессии нет сообщений в очереди на данный моментЗамечательно.
Значит ты посылаешь запрос: SnmpSendMsg ( hSession, srcEntity, dstEntity, hContext, hPDU);
Читаешь ответ: SnmpRecvMsg ( hSession, &srcEntity, &dstEntity, &hContext, &hPDU);
И получаешь "нет сообщений"...
О чем это говорит?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729352
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

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

В каком-то старом КВН было: "Интуитивно я конечно догадываюсь, но хотелось бы уточнить..."Ну так озвучь свою догадку.
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729481
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

яМожет быть сообщение ещё не дошло - почему тогда функция завершается?
Может быть ответ вообще не приходит - почему тогда миб-браузеры его получают?

Я думаю, что что-то неверно указано, а вот что...
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729497
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatWhite Owl,

яМожет быть сообщение ещё не дошло - почему тогда функция завершается?
Может быть ответ вообще не приходит - почему тогда миб-браузеры его получают?

Я думаю, что что-то неверно указано, а вот что... Открываем документацию и читаем первую фразу:
http://msdn.microsoft.com/en-us/library/windows/desktop/aa378229(v=vs.85).aspx The WinSNMP SnmpRecvMsg function retrieves the results of a completed asynchronous request submitted by a call to the SnmpSendMsg function, in the form of an SNMP message.Что эта фраза означает?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729512
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlЧто эта фраза означает?
Такими темпами вы точно никогда не доберётесь до "The SnmpCreateSession function passes an
application window handle and notification message identifier to the Microsoft WinSNMP
implementation. When the application window receives the notification message specified by
the wMsg parameter, the WinSNMP application must call the SnmpRecvMsg function with the
session handle returned by SnmpCreateSession".
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729570
ioscat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Dimitry Sibiryakov,

правильно ли я понимаю, что проблема в:

HSNMP_SESSION hSession = SnmpCreateSession (0,0,fCallback,NULL);
и нужно использовать вариант
MSDNhSession = SnmpCreateSession (myWnd, myMsg, NULL, NULL);
?

Первый параметр - "указатель" на моё приложение, который можно получить командой GetConsoleWindow

Вторым параметром myMsg можно вставить счётчик сессий, главное, чтобы у всех текущих он был уникальный.

Я правильно всё понимаю?
...
Рейтинг: 0 / 0
SnmpRecvMsg function did not complete successfully because all output parameters are NULL
    #38729619
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ioscatDimitry Sibiryakov,

правильно ли я понимаю, что проблема в:Нет, не правильно.
Забудь о сообщении Дмитрия.

Не торопись и переведи фразу: The WinSNMP SnmpRecvMsg function retrieves the results of a completed asynchronous request submitted by a call to the SnmpSendMsg function, in the form of an SNMP message.
...
Рейтинг: 0 / 0
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
48 сообщений из 48, показаны все 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]