GO語言實現TCP端口轉發【代碼】

package main

import (
	"fmt"
	"log"
	"net"
)

func main() {
	//源端口,目的端口
	var fromport, toport int = 2222, 88
	fromaddr := fmt.Sprintf("127.0.0.1:%d", fromport)
	toaddr := fmt.Sprintf("127.0.0.1:%d", toport)

	fromlistener, err := net.Listen("tcp", fromaddr)

	if err != nil {
		log.Fatal("Unable to listen on: %s, error: %s\n", fromaddr, err.Error())
	}
	defer fromlistener.Close()

	for {
		fromcon, err := fromlistener.Accept()
		if err != nil {
			fmt.Printf("Unable to accept a request, error: %s\n", err.Error())
		} else {
			fmt.Println("new connect:" + fromcon.RemoteAddr().String())
		}

		//這邊最好也做個協程,防止阻塞
		toCon, err := net.Dial("tcp", toaddr)
		if err != nil {
			fmt.Printf("can not connect to %s\n", toaddr)
			continue
		}

		go handleConnection(fromcon, toCon)
		go handleConnection(toCon, fromcon)

	}

}

func handleConnection(r, w net.Conn) {
	defer r.Close()
	defer w.Close()

	var buffer = make([]byte, 100000)
	for {
		n, err := r.Read(buffer)
		if err != nil {
			break
		}

		n, err = w.Write(buffer[:n])
		if err != nil {
			break
		}
	}

}

聲明:Nansheng.Su 發表於 2019-05-13 09:53:20 ,共計20字。

轉載請署名:GO語言實現TCP端口轉發【代碼】 | www.sunansheng.com

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章