Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Bagaimana untuk menulis program pemajuan port menggunakan Golang

Bagaimana untuk menulis program pemajuan port menggunakan Golang

PHPz
PHPzasal
2023-04-18 09:07:021141semak imbas

1. Pengenalan latar belakang

Dalam aplikasi praktikal, kita selalunya perlu memajukan port yang berbeza untuk merealisasikan penghantaran dan perkongsian data rangkaian. Contohnya, dalam sesetengah aplikasi perusahaan, kita perlu memajukan permintaan akses daripada rangkaian luaran kepada pelayan pada rangkaian dalaman untuk mengakses dan mengurus aplikasi dalaman. Dalam proses ini, port forwarding adalah teknologi yang mesti digunakan.

Golang ialah bahasa pengaturcaraan baru muncul yang cekap, selamat dan ringkas Bahasa pengaturcaraan biasa lain boleh melakukan pemajuan port dengan kod panggilan yang ditulis dalam Golang.

Artikel ini akan memperkenalkan cara menggunakan Golang untuk menulis program pemajuan port dan menunjukkan kelebihan Golang dalam bidang pengaturcaraan rangkaian.

2. Port forwarding di Golang

  1. Kaedah pelaksanaan

Port forwarding di Golang boleh dikendalikan menggunakan pakej bersih dalam perpustakaan standard tanpa perlu untuk bantuan Perpustakaan bergantung tambahan.

Prinsip pelaksanaan teras pemajuan port adalah untuk mewujudkan dua sambungan rangkaian: satu sambungan mendengar port yang ditentukan, dan sambungan lain mengendalikan operasi pemajuan data. Data yang diterima boleh diproses secara serentak melalui goroutine untuk mencapai penghantaran data yang cekap.

Contoh kod:

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
}

Perihalan kod:

Kod di atas menyediakan perkhidmatan rangkaian luaran dengan mendengar port 8888 tempatan. Apabila pelanggan menyambung ke port 8888, goroutine baharu akan dibuat dan goroutine ini akan mengendalikan operasi pemajuan data. Apabila memajukan data daripada klien, anda perlu mewujudkan sambungan rangkaian ke port tempatan 9999 dan memajukan data ke sambungan ini.

  1. Kesan pelaksanaan

Kesan kod di atas adalah untuk mendengar port 8888 secara setempat Apabila permintaan dibuat untuk mengakses port ini, permintaan akan dimajukan kepada pelabuhan tempatan 9999. Gunakan alat telnet untuk menguji sama ada pemajuan adalah normal:

Apabila menyambung ke port tempatan 8888, konsol sistem akan mengeluarkan baris gesaan teks "Sambungan baharu diterima", menunjukkan pemantauan berjaya. Seterusnya, ikut arahan berikut untuk menyambung ke port 9999:

$ telnet localhost 8888

Selepas sambungan berjaya, masukkan beberapa data, seperti "Hello World!", dan kemudian tekan kekunci Enter. Kita sepatutnya melihat data yang sama muncul pada terminal lain, yang menunjukkan bahawa data telah berjaya dimajukan ke port lain melalui port bersiri.

3. Ringkasan

Melalui pengenalan artikel ini, saya percaya anda telah menguasai cara menggunakan Golang untuk melaksanakan port forwarding, yang sangat membantu untuk kerja pengaturcaraan rangkaian.

Secara amnya, Golang mempunyai kelebihan kecekapan, keselamatan dan kesederhanaan, serta boleh membantu anda merealisasikan keperluan pengaturcaraan rangkaian anda dengan lebih berkesan.

Atas ialah kandungan terperinci Bagaimana untuk menulis program pemajuan port menggunakan Golang. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn