Lösung für das Timeout-Problem der SNMP4J-Serververbindung

Lösung für das Timeout-Problem der SNMP4J-Serververbindung

Als Verwaltungszentrale und Server dient dabei unser Netzwerkmanagementcenter! Jedes verwaltete Gerät kommuniziert über den Switch als Client mit dem Netzwerkverwaltungszentrum und verwendet dabei das TCP/IP-Protokoll!

SNMP ist nur ein Protokollpaket. SNMP4J, ein von SNMP verwendetes Java-Toolkit, bietet praktische und sichere Toolkit-Funktionen!

Bei der Nutzung ist jedoch ein Problem aufgetreten: Wenn Server und Client Nachrichten senden, kommt es nach mehrmaligem Senden nicht mehr zum Datenaustausch! Auch die Erfassung der Netzwerkpakete war nicht erfolgreich und nach der Verfolgung des Haltepunkts wurde ein Problem im SNMP4J-Code entdeckt!

	/**
	 * Sendet eine SNMP-Nachricht an die angegebene Adresse.
	 * 
	 * @param Adresse
	 * eine <code>TcpAddress</code>. Eine
	 * <code>ClassCastException</code> wird geworfen, wenn
	 * <code>Adresse</code> ist keine <code>TcpAddress</code>
	 * Instanz.
	 * @param Nachricht
	 * byte[] die zu sendende Nachricht.
	 * @throws IOException
	 */
	public void sendMessage(Adresse Adresse, Byte[] Nachricht)
			wirft java.io.IOException {
		wenn (server == null) {
			Hören();
		}
		serverThread.sendMessage(Adresse, Nachricht);
	}

Wir können sehen, dass der Unterschied zu UDP darin besteht, dass es einen Service-Thread verwendet!

	public void sendMessage(Adresse Adresse, Byte[] Nachricht)
			wirft java.io.IOException {
		Sockel s = null;
		SocketEntry-Eintrag = (SocketEntry) sockets.get(Adresse);
		wenn (logger.isDebugEnabled()) {
			logger.debug("Suche nach Verbindung für Ziel '"
					+ Adresse + "' zurückgegeben: " + Eintrag);
			logger.debug(sockets.toString());
		}
		wenn (Eintrag != null) {
			s = Eintrag.getSocket();
		}
		wenn ((s == null) || (s.isClosed()) || (!s.isConnected())) {
			wenn (logger.isDebugEnabled()) {
				logger.debug("Socket für Adresse '" + Adresse
						+ "' ist geschlossen, beim Öffnen...");
			}
			ausstehend.entfernen(Eintrag);
			SocketChannel sc = null;
			versuchen {
				//Öffne den Kanal, stelle ihn auf nicht blockierend ein, initiiere
				// verbinden
				sc = SocketChannel.open();
				sc.configureBlocking(false);
				sc
						.connect(neue InetSocketAdresse(
								((TcpAddress) Adresse).getInetAddress(),
								((TcpAddress) Adresse).getPort()));
				s = sc.socket();
				Eintrag = neuer SocketEntry((TcpAddress) Adresse, s);
				Eintrag.addMessage(Nachricht);
				sockets.put(Adresse, Eintrag);
	
				synchronisiert (ausstehend) {
					ausstehend.hinzufügen(Eintrag);
				}
	
				Selektor.wakeup();
				logger.debug("Verbindungsversuch mit " + Adresse);
			} Fang (IOException iox) {
				logger.fehler(iox);
				iox werfen;
			}
		} anders {
			Eintrag.addMessage(Nachricht);
			synchronisiert (ausstehend) {
				ausstehend.hinzufügen(Eintrag);
			}
			Selektor.wakeup();
		}
	}

Er holt die Verbindung SocketEntry von einer Map und holt dann das Verbindungsobjekt Socket!

Bestimmen Sie, ob der Socket gültig ist. Wenn er gültig ist, senden Sie ihn direkt. Wenn er ungültig ist, stellen Sie vor dem Senden eine Verbindung her!

Dann habe ich diesen Code gefunden

private synchronisiert void timeoutSocket(SocketEntry entry) { 
  if (VerbindungsTimeout > 0) { 
    socketCleaner.schedule(neuer SocketTimeout(Eintrag), VerbindungsTimeout); 
  } 
}

Das heißt, der Server prüft die Verbindung selbstständig und baut diese ab!

Ich habe versucht, den Wert von connectionTimeout festzulegen

private void init() wirft UnknownHostException, IOException { 
  ThreadPool = ThreadPool.create("Falle", 2); 
  Dispatcher = neuer MultiThreadedMessageDispatcher (ThreadPool, neuer MessageDispatcherImpl ()); 
  // Lokale IP und Abhörport listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "tcp:192.168.9.69/5055")); 
  DefaultTcpTransportMapping-Transport; 
  transport = neue DefaultTcpTransportMapping((Tcp-Adresse) listenAdresse); 
  transport.setConnectionTimeout(0); 
  snmp = neues Snmp(Dispatcher, Transport); 
  snmp.getMessageDispatcher().addMessageProcessingModel(neues MPv1()); 
  snmp.getMessageDispatcher().addMessageProcessingModel(neues MPv2c()); 
  snmp.getMessageDispatcher().addMessageProcessingModel(neues MPv3()); 
  USM usm = neues USM(SecurityProtocols.getInstance(), neuer OctetString(MPv3.createLocalEngineID()), 0); 
  : SecurityModels.getInstance().addSecurityModel(usm); 
  snmp.listen(); 
}

Fügen Sie eine Codezeile hinzu, um das Timeout von DefaultTcpTransportMapping auf 0 zu setzen!

Dann gibt es kein Problem!

Obwohl das Problem vorübergehend gelöst wurde, befürchte ich, dass es aufgrund meiner mangelnden Kenntnisse von SNMP4J nicht daran liegt!

Ich hoffe auch, dass SNMP4J als Tool und als Server verwendet werden kann, da es eine Lösung für das Problem beim Senden von Daten gibt!

Das Obige ist der vollständige Inhalt dieses Artikels. Ich hoffe, er wird für jedermanns Studium hilfreich sein. Ich hoffe auch, dass jeder 123WORDPRESS.COM unterstützen wird.

Das könnte Sie auch interessieren:
  • Lösen Sie das Problem, dass der MySQL-Server aktiv die Verbindung trennt, wenn kein Betriebstimeout vorliegt
  • Lösung für das Timeout des Miniprogrammservers, der den WeChat-Server anfordert
  • Lösung für das Timeout-Problem des Curl- und Soap-Request-Dienstes in PHP
  • Eine kurze Diskussion über Serviceausnahmen, die durch asynchrones Multithreading-Timeout in Java verursacht werden
  • Detaillierte Erklärung zur Konfiguration des Timeouts im Nginx-Server
  • Das Win7-Systemprotokoll weist darauf hin, dass das Timeout für die Namensauflösung des Namens „Domänenname“ abgelaufen ist, nachdem kein konfigurierter DNS-Server geantwortet hat.
  • Lösung für ORA-12170 TNS: Verbindungstimeout beim Herstellen einer Verbindung zum Oracle-Remoteserver
  • Timeout bei der Verbindung zum Server über FileZilla

<<:  Die spezifische Verwendung und der Unterschied zwischen Attribut und Eigenschaft in Vue

>>:  Der Unterschied zwischen Löschen, Abschneiden und Löschen und wie man wählt

Artikel empfehlen

Vue implementiert eine Wettervorhersagefunktion

In diesem Artikel wird der spezifische Code von V...

MySQL-Lerndatenbankbetrieb DML ausführliche Erklärung für Anfänger

Inhaltsverzeichnis 1. Anweisung einfügen 1.1 Einf...

Aufbau einer Docker+K8S-Clusterumgebung und verteilte Anwendungsbereitstellung

1. Docker installieren yum installiere Docker #St...

Installieren und verwenden Sie Git und GitHub unter Ubuntu Linux

Einführung in Git Git ist eine Open-Source-Versio...

Wird der Index in der MySQL-Abfragebedingung verwendet?

Wenn Sie ein Arbeitgeber fragt, ob in einer MySQL...

Vue definiert private Filter und grundlegende Nutzung

Die Methoden und Konzepte privater und globaler F...

Detaillierter Prozess der NTP-Serverkonfiguration unter Linux

Inhaltsverzeichnis 1. Umgebungskonfiguration 1.NT...

W3C Tutorial (15): W3C SMIL Aktivitäten

SMIL fügt Unterstützung für Timing und Mediensync...

Der gesamte Prozess der Installation von mysql5.7.22 unter der ARM64-Architektur

MySQL-Download-Adresse: https://obs.cn-north-4.my...

MySql 8.0.11-Winxp64 (kostenlose Installationsversion) Konfigurations-Tutorial

1. Entpacken Sie das Zip-Paket in das Installatio...