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-Elternkomponente ruft Funktionsimplementierung der Unterkomponente auf

Die übergeordnete Vue-Komponente ruft die Funktio...

So stellen Sie das umfassende Benutzererlebnis sicher

Verwandte Artikel: Website-Design für Benutzererfa...

Vue3 setup() - Erweiterte Verwendungsbeispiele - ausführliche Erklärung

Inhaltsverzeichnis 1. Unterschiede zwischen Optio...

Detaillierte Erläuterung des Ausführungsprozesses der JavaScript-Engine V8

Inhaltsverzeichnis 1. V8-Quelle 2. V8-Serviceziel...

So erstellen Sie geplante Aufgaben mit dem Crond-Tool in Linux

Vorwort Crond ist ein Tool zur geplanten Ausführu...

Vue implementiert ein einfaches Einkaufswagenbeispiel

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

Beispiel zur Erhöhung des Swap-Speichers im CentOS7-System

Vorwort Swap ist eine spezielle Datei (oder Parti...

So optimieren Sie Bilder, um die Website-Leistung zu verbessern

Inhaltsverzeichnis Überblick Was ist Bildkomprimi...

Echarts-Tutorial zur Implementierung von Baumdiagrammen

Treemaps dienen vor allem der Visualisierung baum...

Beispielcode zur Implementierung von Anti-Shake in Vue

Anti-Shake: Verhindert, dass wiederholte Klicks E...

Erklärung zur Verwendung von JavaScript ECharts

Ich habe ECharts schon einmal bei einem Projekt v...