TCP 接続を使用した Go (Golang) でのプロキシの作成
TCP プロキシを作成する場合、データの保存は非常に重要です。この記事では、メッセージ形式が事前にわからないにもかかわらず、サーバーからすべてのデータがいつ受信されたかを判断する複雑さについて詳しく説明します。
この問題を解決する 1 つの戦略は、各ソケットの読み取り後にプロキシが確実に受信するのを待つことです。データを受信するよりも速く読み取れません。ただし、プロキシが空のソケットと遅延したサーバー応答を区別できないタイムアウト シナリオについて懸念が生じます。
別のアプローチには、待機中の呼び出しの時間をタイムアウト値と比較することが含まれます。待機中の呼び出しがタイムアウトを超えた場合、サーバーが書き込みを停止し、プロキシが続行して接続を閉じることができると考えて間違いありません。
この方法は、狭いデータ センターなどの特定のシナリオでは効果的である可能性があります。遅延を最小限に抑えるには、潜在的な落とし穴を認識することが重要です。たとえば、サーバーが一度に 1 バイトしか書き込まず、遅延が大きい場合、プロキシはメッセージ全体を受信したと誤って判断し、転送を途中で終了する可能性があります。
潜在的なデッドロックを軽減するには、ゴルーチンの使用を検討してください。個別の読み取り操作と書き込み操作を処理し、1 つのブロックされた操作によってプロセス全体が停止しないようにします。
以上がGo TCP プロキシは、メッセージ形式を事前に知らなくても、どのようにして完全なデータ転送を保証できるのでしょうか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。