Обнаружение SNMP-устройства по сети с помощью C#
Дорогой, я разрабатываю сервис c#, который должен сканировать сеть для обнаружения активных snmp-устройств. Я хотел бы получить результат, аналогичный результатам команды NMAP, выполняемой с Linux, с точки зрения основанных устройств.
nmap -P0-v-sU-p 161 192.168.1.0 / 24
Что я уже пробовал:
Просто для проверки я сделал небольшое приложение для сканирования открытого UDP-порта. Сначала я запускаю прослушиватель в поток на порту 161, а затем запускаю отправитель. но я смог вернуть ответ только на 1 устройство, в то время как NMAP вернул мне гораздо больше устройств.
Есть какие-нибудь предложения?
Заранее спасибо,
вот вам мой код:
UDP listner
<pre>// UDP Listener private void button1_Click(object sender, EventArgs e) { new Thread(() => { Thread.CurrentThread.IsBackground = true; int port = int.Parse(txtPort.Text); bool done = false; IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, 161); UdpClient listener = new UdpClient(groupEP); string received_data; byte[] receive_byte_array; try { while (!done) { Console.WriteLine("SERVER: Waiting for broadcast"); receive_byte_array = listener.Receive(ref groupEP); if (!hosts.ContainsKey(groupEP.Address.ToString()) ) { // Console.WriteLine("Received a broadcast from {0}", groupEP.ToString()); hosts.Add(groupEP.Address.ToString(), groupEP.Address.ToString()); Console.WriteLine("SERVER: Received a broadcast from {0}", groupEP.Address.ToString()); received_data = Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length); //Console.WriteLine("data follows \n{0}\n\n", received_data); } } } catch (Exception ex) { Console.WriteLine(ex.ToString()); } }).Start(); }
а здесь Отправитель UDP
<pre>// UDP Sender private void button2_Click(object sender, EventArgs e) { new Thread(() => { int port = int.Parse(txtPort.Text); string message = txtMessage.Text; Boolean done = false; Boolean exception_thrown = false; Socket sending_socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp); IPAddress send_to_address = IPAddress.Parse("192.168.1.255"); IPEndPoint sending_end_point = new IPEndPoint(send_to_address, port); while (!done) { string text_to_send = message; if (text_to_send.Length == 0) { done = true; } else { byte[] send_buffer = Encoding.ASCII.GetBytes(text_to_send); Console.WriteLine("CLIENT: sending to address: {0} port: {1}", sending_end_point.Address, sending_end_point.Port); try { sending_socket.SendTimeout = 5000; sending_socket.SendTo(send_buffer, sending_end_point); } catch (Exception send_exception) { exception_thrown = true; Console.WriteLine("CLIENT: Exception {0}", send_exception.Message); } if (exception_thrown == false) { Console.WriteLine("CLIENT: Message has been sent to the broadcast address"); } else { exception_thrown = false; Console.WriteLine("CLIENT: The exception indicates the message was not sent."); } } } // end of while (!done) }).Start(); } }