SNMP4J サーバー接続タイムアウト問題の解決策

SNMP4J サーバー接続タイムアウト問題の解決策

弊社のネットワーク管理センターは管理センター兼サーバーとして機能します!各管理対象デバイスは、TCP/IP プロトコルを使用して、クライアントとしてスイッチを介してネットワーク管理センターと通信します。

SNMP は単なるプロトコル パッケージです。SNMP で使用される Java ツールキットである SNMP4J は、便利で安全なツールキット機能を提供します。

しかし、使用中に問題が見つかりました。サーバーとクライアントがメッセージを送信すると、数回送信した後、データが送信されなくなりました。ネットワーク パケットのキャプチャも失敗し、ブレークポイントをトレースした後、SNMP4J コードに問題が見つかりました。

	/**
	 * 指定されたアドレスに SNMP メッセージを送信します。
	 * 
	 * @param アドレス
	 * <code>TcpAddress</code>。
	 * <code>ClassCastException</code> がスローされます。
	 * <code>address</code> は <code>TcpAddress</code> ではありません
	 * 実例。
	 * @param メッセージ
	 * byte[] 送信するメッセージ。
	 * @throwsIOException 例外をスローします
	 */
	public void sendMessage(Address アドレス、byte[] メッセージ)
			java.io.IOException をスローします {
		if (サーバー == null) {
			聞く();
		}
		serverThread.sendMessage(アドレス、メッセージ);
	}

UDP との違いは、サービス スレッドを使用している点であることがわかります。

	public void sendMessage(Address アドレス、byte[] メッセージ)
			java.io.IOException をスローします {
		ソケット s = null;
		SocketEntry エントリ = (SocketEntry) sockets.get(address);
		ロガーがデバッグ有効の場合
			logger.debug("宛先への接続を検索しています '"
					+ アドレス + "' が返されました: " + エントリ);
			ロガー.デバッグ(sockets.toString());
		}
		if (エントリ != null) {
			s = エントリ.getSocket();
		}
		s == null の場合 || (s.isClosed()) || (!s.isConnected())) {
			ロガーがデバッグ有効の場合
				logger.debug("アドレス ' のソケット" + アドレス
						+ "' は閉じられており、開くと...");
			}
			保留中。削除(エントリ);
			ソケットチャネル sc = null;
			試す {
				// チャネルを開き、非ブロッキングに設定し、開始します
				// 接続する
				sc = SocketChannel.open();
				sc.configureBlocking(false);
				scで
						.connect(新しいInetSocketAddress(
								((TcpAddress) アドレス).getInetAddress(),
								((TcpAddress) アドレス).getPort()));
				s = sc.socket();
				エントリ = 新しい SocketEntry((TcpAddress) アドレス、s);
				エントリ.addMessage(メッセージ);
				sockets.put(アドレス、エントリ);
	
				同期済み(保留中){
					保留中。追加(エントリ);
				}
	
				セレクター.wakeup();
				logger.debug("" + アドレスに接続しようとしています);
			} キャッチ (IOException iox) {
				ロガーエラー(iox);
				iox を投げる;
			}
		} それ以外 {
			エントリ.addMessage(メッセージ);
			同期済み(保留中){
				保留中。追加(エントリ);
			}
			セレクター.wakeup();
		}
	}

彼は Map から接続 SocketEntry を取得し、次に接続オブジェクト Socket を取得します。

ソケットが有効かどうかを判断します。有効な場合は、直接送信します。無効な場合は、送信する前に接続を作成します。

そして私はこのコードを見つけました

プライベート同期void timeoutSocket(SocketEntryエントリ) { 
  接続タイムアウト > 0 の場合 
    socketCleaner.schedule(新しいSocketTimeout(entry)、connectionTimeout); 
  } 
}

つまり、サーバーが接続自体をチェックし、クリアするのです。

connectionTimeoutの値を設定してみました

プライベートvoid init()はUnknownHostException、IOExceptionをスローします{ 
  スレッドプール = ThreadPool.create("トラップ", 2); 
  ディスパッチャー = 新しい MultiThreadedMessageDispatcher(threadPool、新しい MessageDispatcherImpl()); 
  // ローカル IP とリスニング ポート listenAddress = GenericAddress.parse(System.getProperty("snmp4j.listenAddress", "tcp:192.168.9.69/5055")); 
  DefaultTcpTransportMapping トランスポート; 
  トランスポート = 新しい DefaultTcpTransportMapping((TcpAddress) listenAddress); 
  トランスポート.setConnectionTimeout(0); 
  snmp = 新しい Snmp(ディスパッチャ、トランスポート); 
  snmp.getMessageDispatcher().addMessageProcessingModel(新しいMPv1()); 
  snmp.getMessageDispatcher().addMessageProcessingModel(新しい MPv2c()); 
  snmp.getMessageDispatcher().addMessageProcessingModel(新しいMPv3()); 
  USM usm = 新しい USM(SecurityProtocols.getInstance()、新しい OctetString(MPv3.createLocalEngineID())、0); 
  セキュリティモデルを取得します。セキュリティモデルを追加します(usm); 
  snmp.listen(); 
}

DefaultTcpTransportMapping のタイムアウトを 0 に設定するコード行を追加します。

そうすれば問題はありません!

問題は一時的に解決しましたが、SNMP4J についての私の深い理解が不足しているため、問題はこれではない可能性があります。

私もツールとしてSNMP4Jを使いたいのですが、サーバーとしてデータ送信時の問題の解決策があります!

以上がこの記事の全内容です。皆様の勉強のお役に立てれば幸いです。また、123WORDPRESS.COM を応援していただければ幸いです。

以下もご興味があるかもしれません:
  • 操作タイムアウトがないときにMySQLサーバーがアクティブに切断される問題を解決します
  • WeChatサーバーにリクエストするミニプログラムサーバーのタイムアウトの解決策
  • PHP での curl および soap リクエスト サービスのタイムアウト問題の解決方法
  • Java の非同期マルチスレッド タイムアウトによって発生するサービス例外についての簡単な説明
  • Nginxサーバーでタイムアウトを設定する方法の詳細な説明
  • 構成された DNS サーバーが応答しないため、Win7 システム ログに「ドメイン名」の名前解決のタイムアウトが期限切れになったことが示されます。
  • ORA-12170 TNS の解決策: Oracle リモート サーバーへの接続時に接続タイムアウトが発生する
  • FileZilla を使用してサーバーに接続するとタイムアウトが発生する

<<:  Vue における属性とプロパティの具体的な使用法と違い

>>:  削除、切り捨て、ドロップの違いと選択方法

推薦する

MySQL で distinct メソッドを使用する詳細な例

明確な意味: distinctive は、一意のレコードの数を照会するために使用されます。つまり、d...

Chromeブラウザ設定の新バージョンではクロスドメイン実装が可能

序文現在、フロントエンドは主に webpack の devServer の構成を通じてクロスドメイン...

React refの使用例

目次refとは何かrefの使い方DOM要素に配置するクラスコンポーネントに配置する関数コンポーネント...

iviewは動的なフォームとカスタム検証期間の重複を実装します

フォーム項目を動的に追加するiview の動的なフォーム追加は非常に簡単です。フォーム項目を配列に設...

Vue の 2 択タブバー切り替えの新しいアプローチ

問題の説明プロジェクトに取り組んでいるときに、タブ バーの切り替え効果を作成する必要がある場合があり...

MySQL からエクスポートされた scv ファイル内の文字化けやジャンプ行の問題をすばやく解決します

仕事上の理由により、完全なオンライン化(​​つまり、すべてのデータがオンラインで完了し、インポートや...

MySQL データベース アカウントの作成、認証、データのエクスポートおよびインポート操作の例

この記事では、MySQL データベースでのアカウントの作成、認証、データのエクスポートおよびインポー...

Reactフックとzarmコンポーネントライブラリ構成に基づいてh5フォームページを開発するためのサンプルコード

最近、React Hooks を zarm コンポーネント ライブラリと組み合わせて使用​​し、js...

nginx をシャットダウン/再起動/起動する方法

閉鎖サービス nginx 停止systemctl 停止 nginx起動するサービス nginx 開始...

MySQL の重複データの処理方法 (防止と削除)

一部の MySQL テーブルには重複レコードが含まれている場合があります。重複データが存在することを...

MySQL ログイン エラーを解決する: 'ユーザー 'root'@'localhost' へのアクセスが拒否されました

まず、コマンドラインまたはワークベンチを使用して MySQL にログインできず、「ユーザー '...

mysql5.7.21.zip インストールチュートリアル

mysql5.7.21 zipの詳細なインストール手順は次のとおりです。 1. 解凍して指定されたデ...

スパンの最小高さを定義するソリューションは効果がありません

span タグは HTML ウェブページを作成するときによく使用されますが、このタグの使い方がよくわ...

アイデアを通じてプロジェクトをDockerにパッケージ化する方法

多くの友人が、Docker でプロジェクトを実行する方法をずっと知りたがっていました。今日は、自分の...

Vue マルチ選択リスト コンポーネントの詳細な説明

マルチ選択は、すべてのオプションを一覧表示し、ユーザーが Ctrl/Shift キーを使用して複数選...