golang tcp クローズエラーレポート
最近、Golang を使って TCP 通信プログラムを書いていたところ、奇妙な Close エラーが発生したので、記録して共有します。
背景
私が作成した TCP 通信プログラムでは、Go 標準ライブラリの net パッケージを使用して、DialTCP 関数を介してサーバーに接続しました。通信が完了したら、Close メソッドを使用して接続を閉じます。ほとんどの場合、このプロセスは成功します。ただし、Close メソッドを呼び出すと、奇妙なエラーがスローされ、プログラムがクラッシュすることがあります。
エラーの説明
-Close tcp call error-
説明: ピアによってリセットされました`
エラー ログに表示され、Close メソッドを使用して閉じられました。接続すると、「ピアによるリセット」エラーが報告されます。これは、サーバーが接続を積極的に閉じていることを意味します。
トラブルシューティング
最初のステップでは、ソース コードをチェックし、Close メソッドを呼び出す前に接続が閉じられていないことを確認しました。 2 番目のステップでは、コードの観点から問題を分析し、コードの欠陥を除去します。
3 番目のステップでは、この問題を検索したところ、同様のケースが見つかりました。オープンソース コミュニティ Github では、多くの人が同様の問題に遭遇しています。これはオペレーティング システムの TCP 仕様の実装に問題があると考える人もいれば、ネットワーク カード ドライバのエラーであると考える人もいます。この情報を見た後、TCP プロトコルの仕様を確認したところ、確かに接続を閉じる操作を待機する TIME_WAIT 時間が存在することがわかりました。
具体的には、TCP 接続が閉じられた後、オペレーティング システムは、接続が完全に閉じられたことを確認するまで一定時間待機してから、関連リソースを解放します。この時間は通常 2MSL (最大セグメント存続期間) で、Linux のデフォルトは 60 秒です。この待機時間中に同じアドレスとポートを持つ新しい接続要求があると、RST セグメントがトリガーされ、相手が接続を早期に終了し、「ピアによるリセット」エラーが発生します。
それでは、この問題をどうやって解決すればいいのでしょうか?
解決策
この問題には 2 つの解決策があります:
- TIME_WAIT 時間を延長します。
Linux カーネルのパラメータを変更して、TIME_WAIT 時間を延長します。待機時間を長くすると、接続が完全に閉じられるようになります。もちろん、この延長期間中に、長期間 TIME_WAIT 状態になっているシステム内の接続の数も増加します。
- SO_REUSEADDR オプションを設定して、接続アドレスを再利用可能にします。
接続を閉じるときは、SO_REUSEADDR オプションをオンにして、接続アドレスを再利用できるようにします。このようにして、接続が閉じられた後、次の新しい接続で元のアドレスを直接再利用できるため、「ピアによるリセット」エラーが回避されます。具体的な実装方法は次のとおりです。
conn, err := net.DialTCP("tcp", nil, tcpAddr) err = conn.SetReuseAddr(true) err = conn.Close()
概要
上記は、Golang を使用して TCP 通信プログラムを作成したときに遭遇した、奇妙な Close エラー ケースです。これは、TCP 仕様で要求される TIME_WAIT 時間により、接続がすぐに解放されないためです。待機時間を延長するか、SO_REUSEADDR オプションを有効にすることで、このタイプのエラーを回避できます。同時に、これは、ネットワーク プログラミングを行うときに、不要なエラーを避けるために TCP 仕様の詳細に注意を払う必要があることも思い出させます。
以上がgolang tcp クローズエラーレポートの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

メモ帳++7.3.1
使いやすく無料のコードエディター

SublimeText3 中国語版
中国語版、とても使いやすい

ゼンドスタジオ 13.0.1
強力な PHP 統合開発環境

ドリームウィーバー CS6
ビジュアル Web 開発ツール

SublimeText3 Mac版
神レベルのコード編集ソフト(SublimeText3)

ホットトピック











Golangは、パフォーマンスとスケーラビリティの点でPythonよりも優れています。 1)Golangのコンピレーションタイプの特性と効率的な並行性モデルにより、高い並行性シナリオでうまく機能します。 2)Pythonは解釈された言語として、ゆっくりと実行されますが、Cythonなどのツールを介してパフォーマンスを最適化できます。

Golangは並行性がCよりも優れていますが、Cは生の速度ではGolangよりも優れています。 1)Golangは、GoroutineとChannelを通じて効率的な並行性を達成します。これは、多数の同時タスクの処理に適しています。 2)Cコンパイラの最適化と標準ライブラリを介して、極端な最適化を必要とするアプリケーションに適したハードウェアに近い高性能を提供します。

Golangは迅速な発展と同時シナリオに適しており、Cは極端なパフォーマンスと低レベルの制御が必要なシナリオに適しています。 1)Golangは、ごみ収集と並行機関のメカニズムを通じてパフォーマンスを向上させ、高配列Webサービス開発に適しています。 2)Cは、手動のメモリ管理とコンパイラの最適化を通じて究極のパフォーマンスを実現し、埋め込みシステム開発に適しています。

speed、効率、およびシンプル性をspeedsped.1)speed:gocompilesquilesquicklyandrunseffictient、理想的なlargeprojects.2)効率:等系dribribraryreducesexexternaldedenciess、開発効果を高める3)シンプルさ:

goisidealforforbeginnersandsutable forcloudnetworkservicesduetoitssimplicity、andconcurrencyfeatures.1)installgofromtheofficialwebsiteandverify with'goversion'.2)

GolangとPythonにはそれぞれ独自の利点があります。Golangは高性能と同時プログラミングに適していますが、PythonはデータサイエンスとWeb開発に適しています。 Golangは同時性モデルと効率的なパフォーマンスで知られていますが、Pythonは簡潔な構文とリッチライブラリエコシステムで知られています。

Cは、ハードウェアリソースと高性能の最適化が必要なシナリオにより適していますが、Golangは迅速な開発と高い並行性処理が必要なシナリオにより適しています。 1.Cの利点は、ハードウェア特性と高い最適化機能に近いものにあります。これは、ゲーム開発などの高性能ニーズに適しています。 2.Golangの利点は、その簡潔な構文と自然な並行性サポートにあり、これは高い並行性サービス開発に適しています。

GolangとCのパフォーマンスの違いは、主にメモリ管理、コンピレーションの最適化、ランタイム効率に反映されています。 1)Golangのゴミ収集メカニズムは便利ですが、パフォーマンスに影響を与える可能性があります。
