#c# #ip #byte #snmp #sharp-snmp
#c# #ip #байт #snmp #sharp-snmp
Вопрос:
https://github.com/lextm/sharpsnmplib/blob/master/SharpSnmpLib/IP.cs
System.ArgumentException: bytes must contain 4 or 16 elements
at Lextm.SharpSnmpLib.IP..ctor(Tuple`2 length, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Int32 type, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Stream stream)
at Lextm.SharpSnmpLib.Sequence..ctor(Tuple`2 length, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Int32 type, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Stream stream)
at Lextm.SharpSnmpLib.Sequence..ctor(Tuple`2 length, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Int32 type, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Stream stream)
at Lextm.SharpSnmpLib.ResponsePdu..ctor(Tuple`2 length, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Int32 type, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Stream stream)
at Lextm.SharpSnmpLib.Sequence..ctor(Tuple`2 length, Stream stream)
at Lextm.SharpSnmpLib.DataFactory.CreateSnmpData(Int32 type, Stream stream)
at Lextm.SharpSnmpLib.Messaging.MessageFactory.ParseMessage(Int32 first, Stream stream, UserRegistry registry)
at Lextm.SharpSnmpLib.Messaging.MessageFactory.ParseMessages(Byte[] buffer, Int32 index, Int32 length, UserRegistry registry)
at Lextm.SharpSnmpLib.Messaging.SnmpMessageExtension.GetResponse(ISnmpMessage request, Int32 timeout, IPEndPoint receiver, UserRegistry registry, Socket udpSocket)
at Lextm.SharpSnmpLib.Messaging.SnmpMessageExtension.GetResponse(ISnmpMessage request, Int32 timeout, IPEndPoint receiver, Socket udpSocket)
at Lextm.SharpSnmpLib.Messaging.SnmpMessageExtension.GetResponse(ISnmpMessage request, Int32 timeout, IPEndPoint receiver)
at Lextm.SharpSnmpLib.Messaging.Messenger.BulkHasNext(VersionCode version, IPEndPoint endpoint, OctetString community, Variable seed, Int32 timeout, Int32 maxRepetitions, IList`1amp; next, IPrivacyProvider privacy, ISnmpMessageamp; report)
at Lextm.SharpSnmpLib.Messaging.Messenger.BulkWalk(VersionCode version, IPEndPoint endpoint, OctetString community, ObjectIdentifier table, IList`1 list, Int32 timeout, Int32 maxRepetitions, WalkMode mode, IPrivacyProvider privacy, ISnmpMessage report)
at Maprinter.snmpWalk..ctor(String IP, String ID, Int32 timeOut)
Я использую эту библиотеку для извлечения некоторых данных с сетевых принтеров. Пока все работает хорошо, и большинство принтеров возвращают мне данные, которые я ищу. Но когда я получаю эту ошибку, я ничего не получаю от принтера, так что же вызывает эту ошибку?
Messenger.BulkWalk(VersionCode.V2,
new IPEndPoint(IPAddress.Parse("10.0.0.101"), 161),
new OctetString("public"),
new ObjectIdentifier("1.3.6.1"),
result,
timeOut,
10,
WalkMode.Default,
null,
null);
Комментарии:
1. Пожалуйста, покажите нам код, который вызывает исключение? Более конкретно покажите нам параметры, которые вы передаете конструктору класса IP
2. Я получаю IP-адрес непосредственно с принтера и обновил вопрос, чтобы показать свой код. @YuvalItzchakov
3. Какая строка вызывает исключение?
4. Messenger. BulkWalk(versionCode.V2, новая IPEndPoint(IPAddress. Синтаксический анализ (IP), 161), новая октетная строка («public»), новый ObjectIdentifier (ID), результат, время ожидания, 10, WalkMode. По умолчанию null, null); @YuvalItzchakov
5. Когда возникает эта ошибка? повторяется ли это в определенных сценариях? или это происходит случайным образом?
Ответ №1:
Исключение, вероятно, было вызвано агентом SNMP на этом устройстве, который отправил пустое IpAddress
тело (0x40, 0x00). Это нарушает стандарт, поскольку результатом должно быть Null
тело (0x05, 0x00).
IpAddress
определено в RFC2578, которое состоит строго из 4 байт. Вот почему #SNMP проверяет на 4. Проверка на 16 выполняется для адресов IPv6, хотя на самом деле они должны поддерживаться пользовательскими соглашениями.
В вашем случае параметры могут быть,
- Исправьте прошивку, чтобы отправлялось правильное тело.
- Измените базу кода #SNMP (лицензия MIT / X11) в соответствии с вашими потребностями.
Комментарии:
1. Я хочу иметь возможность работать со всеми принтерами, поддерживающими SNMP .. исправление прошивки не устранило бы проблему с другими принтерами. Я ясно вижу, что вы понимаете, что должно быть сделано, и я знаю, что вы разработчик этой библиотеки. Можете ли вы, пожалуйста, подсказать мне, что нужно сделать? Что я должен изменить в вашей библиотеке и к какому файлу мне следует обратиться? @Lex Li
2. Насколько я понимаю ваш ответ, мне нужно разрешить моему программному обеспечению получать оба (0x40, 0x00) и (0x05, 0x00) значения null с принтера. Итак, я нашел этот файл: github.com/lextm/sharpsnmplib/blob/master/SharpSnmpLib /… он определяет Null как 0x05. Как я могу определить значение Null как для 0x05, так и для 0x40? @Lex Li
3. Я хотел бы, чтобы у вас было время внимательно прочитать каждое введенное мной слово. Очевидно, я показал вам, что 0x40 для
IpAddress
. Чтобы разрешить получение 0x40, 0x00 без исключений, вы могли бы просто закомментировать строку, которая выдает исключение. Если вы даже этого не смогли понять, вам, вероятно, нужно больше изучать C #. Я не могу предложить вам больше, поскольку все ключевые моменты рассмотрены. Если вам действительно нужны коммерческие консультационные услуги, дайте мне знать.4. закомментируйте строку, которая выдает исключение, ничего не сделало для решения моей проблемы.