Go语言流量转发程序示例:简单易懂的代码实现
以下是一个简单的流量转发程序的示例,使用Go语言编写:
package main
import (
"fmt"
"net"
)
func main() {
listenAddr := '127.0.0.1:8000'
forwardAddr := '127.0.0.1:9000'
listener, err := net.Listen('tcp', listenAddr)
if err != nil {
fmt.Println('Error listening:', err.Error())
return
}
defer listener.Close()
fmt.Println('Listening on', listenAddr)
for {
conn, err := listener.Accept()
if err != nil {
fmt.Println('Error accepting:', err.Error())
continue
}
go handleConnection(conn, forwardAddr)
}
}
func handleConnection(conn net.Conn, forwardAddr string) {
forward, err := net.Dial('tcp', forwardAddr)
if err != nil {
fmt.Println('Error forwarding:', err.Error())
conn.Close()
return
}
defer forward.Close()
go func() {
_, err := conn.Write([]byte('Connected to forward server\n'))
if err != nil {
fmt.Println('Error writing to client:', err.Error())
forward.Close()
conn.Close()
return
}
}()
go func() {
_, err := forward.Write([]byte('Connected to client\n'))
if err != nil {
fmt.Println('Error writing to forward server:', err.Error())
forward.Close()
conn.Close()
return
}
}()
buffer := make([]byte, 1024)
for {
n, err := conn.Read(buffer)
if err != nil {
fmt.Println('Error reading from client:', err.Error())
forward.Close()
conn.Close()
return
}
_, err = forward.Write(buffer[:n])
if err != nil {
fmt.Println('Error writing to forward server:', err.Error())
forward.Close()
conn.Close()
return
}
}
}
该程序监听在本地地址的8000端口上,并将连接转发到本地地址的9000端口上。它使用两个goroutine,一个处理从客户端读取的数据并将其转发到服务器,另一个处理从服务器读取的数据并将其转发到客户端。在处理连接时,该程序还向客户端和服务器发送了一些欢迎信息。
原文地址: https://www.cveoy.top/t/topic/oFKG 著作权归作者所有。请勿转载和采集!