ホームページ バックエンド開発 Golang Golang を使用してポート転送プログラムを作成する方法

Golang を使用してポート転送プログラムを作成する方法

Apr 18, 2023 am 09:07 AM

1. 背景の紹介

実際のアプリケーションでは、ネットワーク データの送信と共有を実現するために、さまざまなポートを転送する必要があることがよくあります。たとえば、一部のエンタープライズ アプリケーションでは、内部アプリケーションにアクセスして管理するために、外部ネットワークから内部ネットワーク上のサーバーにアクセス要求を転送する必要があります。このプロセスでは、ポート フォワーディングを使用する必要があります。

Golang は、効率的、安全、簡潔な新興プログラミング言語です。他の一般的なプログラミング言語では、Golang で記述されたコードを呼び出すことでポート転送を実行できます。

この記事では、Golang を使用してポート転送プログラムを作成する方法を紹介し、ネットワーク プログラミングの分野における Golang の利点を示します。

2. Golang はポート フォワーディングを実装します

  1. 実装方法

Golang のポート フォワーディングは、標準ライブラリの net パッケージを使用してヘルプなしで操作できます。追加の依存ライブラリの数。

ポート転送の中心的な実装原則は、2 つのネットワーク接続を確立することです。1 つの接続は指定されたポートをリッスンし、もう 1 つの接続はデータ転送操作を処理します。受信したデータはゴルーチンを通じて同時に処理し、効率的なデータ転送を実現します。

コード例:

package main

import (
    "fmt"
    "net"
)

func main() {
    listener, err := net.Listen("tcp", ":8888")
    if err != nil {
        fmt.Println("Error: ", err)
        return
    }

    for {
        conn, err := listener.Accept()
        if err != nil {
            fmt.Println("Error: ", err)
            continue
        }

        go handleConnection(conn)
    }
}

func handleConnection(conn net.Conn) {
    remote, err := net.Dial("tcp", "localhost:9999")
    if err != nil {
        fmt.Println("Error: ", err)
        return
    }

    defer remote.Close()
    defer conn.Close()

    go func() {
        _, err := copyData(conn, remote)
        if err != nil {
            fmt.Println("Error: ", err)
            return
        }
    }()

    _, err = copyData(remote, conn)
    if err != nil {
        fmt.Println("Error: ", err)
        return
    }
}

func copyData(dst net.Conn, src net.Conn) (int, error) {
    buf := make([]byte, 256)

    n, err := src.Read(buf)
    if err != nil {
        return 0, err
    }

    n, err = dst.Write(buf[:n])
    if err != nil {
        return 0, err
    }

    return n, nil
}
ログイン後にコピー

コードの説明:

上記のコードは、ローカル 8888 ポートをリッスンすることで外部ネットワーク サービスを提供します。クライアントがポート 8888 に接続すると、新しい goroutine が作成され、この goroutine がデータ転送操作を処理します。クライアントからデータを転送するときは、ローカル ポート 9999 へのネットワーク接続を確立し、この接続にデータを転送する必要があります。

  1. 実装効果

上記のコードの効果は、ポート 8888 をローカルでリッスンすることです。このポートへのアクセス要求が行われると、要求は次のアドレスに転送されます。ローカルポート9999。 Telnet ツールを使用して、転送が正常かどうかをテストします。

ローカル ポート 8888 に接続すると、システム コンソールに「新しい接続を受信しました」というテキスト プロンプトが 1 行出力され、監視が成功したことが示されます。次に、次のコマンドに従ってポート 9999 に接続します。

$ telnet localhost 8888
ログイン後にコピー

接続が成功したら、「Hello World!」などのデータを入力し、Enter キーを押します。同じデータが別の端末に表示されるはずです。これは、データがシリアル ポートを介して別のポートに正常に転送されたことを示しています。

3. 概要

この記事の導入部を通じて、ネットワーク プログラミング作業に非常に役立つ、Golang を使用してポート フォワーディングを実装する方法を習得できたと思います。

一般に、Golang には効率性、セキュリティ、シンプルさという利点があり、ネットワーク プログラミングのニーズをより効果的に実現するのに役立ちます。

以上がGolang を使用してポート転送プログラムを作成する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。

ホットな記事タグ

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

SublimeText3 中国語版

SublimeText3 中国語版

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

ゼンドスタジオ 13.0.1

ゼンドスタジオ 13.0.1

強力な PHP 統合開発環境

ドリームウィーバー CS6

ドリームウィーバー CS6

ビジュアル Web 開発ツール

SublimeText3 Mac版

SublimeText3 Mac版

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

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか? Mar 03, 2025 pm 05:17 PM

Go Language Packのインポート:アンダースコアとアンダースコアなしの違いは何ですか?

Beegoフレームワークのページ間で短期情報転送を実装する方法は? Beegoフレームワークのページ間で短期情報転送を実装する方法は? Mar 03, 2025 pm 05:22 PM

Beegoフレームワークのページ間で短期情報転送を実装する方法は?

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか? Mar 10, 2025 pm 05:38 PM

GOでテスト用のモックオブジェクトとスタブを書くにはどうすればよいですか?

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか? Mar 10, 2025 pm 05:36 PM

トレースツールを使用して、GOアプリケーションの実行フローを理解するにはどうすればよいですか?

Goでユニットテストをどのように書きますか? Goでユニットテストをどのように書きますか? Mar 21, 2025 pm 06:34 PM

Goでユニットテストをどのように書きますか?

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は? Mar 03, 2025 pm 05:18 PM

MySQLクエリ結果リストをGO言語のカスタム構造スライスに変換する方法は?

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか? Mar 10, 2025 pm 03:20 PM

GOのジェネリックのカスタムタイプ制約を定義するにはどうすればよいですか?

Go言語でファイルを便利に書く方法は? Go言語でファイルを便利に書く方法は? Mar 03, 2025 pm 05:15 PM

Go言語でファイルを便利に書く方法は?

See all articles