mirror of
https://github.com/MetaCubeX/mihomo.git
synced 2024-12-27 12:35:39 +08:00
197 lines
3.5 KiB
Go
197 lines
3.5 KiB
Go
|
//go:build linux
|
||
|
// +build linux
|
||
|
|
||
|
package faketcp
|
||
|
|
||
|
import (
|
||
|
"log"
|
||
|
"net"
|
||
|
"net/http"
|
||
|
_ "net/http/pprof"
|
||
|
"testing"
|
||
|
)
|
||
|
|
||
|
//const testPortStream = "127.0.0.1:3456"
|
||
|
//const testPortPacket = "127.0.0.1:3457"
|
||
|
|
||
|
const testPortStream = "127.0.0.1:3456"
|
||
|
const portServerPacket = "[::]:3457"
|
||
|
const portRemotePacket = "127.0.0.1:3457"
|
||
|
|
||
|
func init() {
|
||
|
startTCPServer()
|
||
|
startTCPRawServer()
|
||
|
go func() {
|
||
|
log.Println(http.ListenAndServe("0.0.0.0:6060", nil))
|
||
|
}()
|
||
|
}
|
||
|
|
||
|
func startTCPServer() net.Listener {
|
||
|
l, err := net.Listen("tcp", testPortStream)
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
|
||
|
go func() {
|
||
|
defer l.Close()
|
||
|
for {
|
||
|
conn, err := l.Accept()
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
go handleRequest(conn)
|
||
|
}
|
||
|
}()
|
||
|
return l
|
||
|
}
|
||
|
|
||
|
func startTCPRawServer() *TCPConn {
|
||
|
conn, err := Listen("tcp", portServerPacket)
|
||
|
if err != nil {
|
||
|
log.Panicln(err)
|
||
|
}
|
||
|
err = conn.SetReadBuffer(1024 * 1024)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
}
|
||
|
err = conn.SetWriteBuffer(1024 * 1024)
|
||
|
if err != nil {
|
||
|
log.Println(err)
|
||
|
}
|
||
|
|
||
|
go func() {
|
||
|
defer conn.Close()
|
||
|
buf := make([]byte, 1024)
|
||
|
for {
|
||
|
n, addr, err := conn.ReadFrom(buf)
|
||
|
if err != nil {
|
||
|
log.Println("server readfrom:", err)
|
||
|
return
|
||
|
}
|
||
|
//echo
|
||
|
n, err = conn.WriteTo(buf[:n], addr)
|
||
|
if err != nil {
|
||
|
log.Println("server writeTo:", err)
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
}()
|
||
|
return conn
|
||
|
}
|
||
|
|
||
|
func handleRequest(conn net.Conn) {
|
||
|
defer conn.Close()
|
||
|
|
||
|
for {
|
||
|
buf := make([]byte, 1024)
|
||
|
size, err := conn.Read(buf)
|
||
|
if err != nil {
|
||
|
log.Println("handleRequest:", err)
|
||
|
return
|
||
|
}
|
||
|
data := buf[:size]
|
||
|
conn.Write(data)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestDialTCPStream(t *testing.T) {
|
||
|
conn, err := Dial("tcp", testPortStream)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
|
||
|
addr, err := net.ResolveTCPAddr("tcp", testPortStream)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
n, err := conn.WriteTo([]byte("abc"), addr)
|
||
|
if err != nil {
|
||
|
t.Fatal(n, err)
|
||
|
}
|
||
|
|
||
|
buf := make([]byte, 1024)
|
||
|
if n, addr, err := conn.ReadFrom(buf); err != nil {
|
||
|
t.Fatal(n, addr, err)
|
||
|
} else {
|
||
|
log.Println(string(buf[:n]), "from:", addr)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func TestDialToTCPPacket(t *testing.T) {
|
||
|
conn, err := Dial("tcp", portRemotePacket)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
|
||
|
addr, err := net.ResolveTCPAddr("tcp", portRemotePacket)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
|
||
|
n, err := conn.WriteTo([]byte("abc"), addr)
|
||
|
if err != nil {
|
||
|
t.Fatal(n, err)
|
||
|
}
|
||
|
log.Println("written")
|
||
|
|
||
|
buf := make([]byte, 1024)
|
||
|
log.Println("readfrom buf")
|
||
|
if n, addr, err := conn.ReadFrom(buf); err != nil {
|
||
|
log.Println(err)
|
||
|
t.Fatal(n, addr, err)
|
||
|
} else {
|
||
|
log.Println(string(buf[:n]), "from:", addr)
|
||
|
}
|
||
|
|
||
|
log.Println("complete")
|
||
|
}
|
||
|
|
||
|
func TestSettings(t *testing.T) {
|
||
|
conn, err := Dial("tcp", portRemotePacket)
|
||
|
if err != nil {
|
||
|
t.Fatal(err)
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
if err := conn.SetDSCP(46); err != nil {
|
||
|
log.Fatal("SetDSCP:", err)
|
||
|
}
|
||
|
if err := conn.SetReadBuffer(4096); err != nil {
|
||
|
log.Fatal("SetReaderBuffer:", err)
|
||
|
}
|
||
|
if err := conn.SetWriteBuffer(4096); err != nil {
|
||
|
log.Fatal("SetWriteBuffer:", err)
|
||
|
}
|
||
|
}
|
||
|
|
||
|
func BenchmarkEcho(b *testing.B) {
|
||
|
conn, err := Dial("tcp", portRemotePacket)
|
||
|
if err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
defer conn.Close()
|
||
|
|
||
|
addr, err := net.ResolveTCPAddr("tcp", portRemotePacket)
|
||
|
if err != nil {
|
||
|
b.Fatal(err)
|
||
|
}
|
||
|
|
||
|
buf := make([]byte, 1024)
|
||
|
b.ReportAllocs()
|
||
|
b.SetBytes(int64(len(buf)))
|
||
|
for i := 0; i < b.N; i++ {
|
||
|
n, err := conn.WriteTo(buf, addr)
|
||
|
if err != nil {
|
||
|
b.Fatal(n, err)
|
||
|
}
|
||
|
|
||
|
if n, addr, err := conn.ReadFrom(buf); err != nil {
|
||
|
b.Fatal(n, addr, err)
|
||
|
}
|
||
|
}
|
||
|
}
|