Skip to content

Commit

Permalink
[tcpproxy/udpproxy] Add dummy TCP and UDP clients to facilitate revie…
Browse files Browse the repository at this point in the history
…wing and testing (thanks to @

samutamm)
  • Loading branch information
jxd1990 committed Jan 4, 2022
1 parent 59dc6e6 commit 97b8f1a
Show file tree
Hide file tree
Showing 2 changed files with 164 additions and 2 deletions.
83 changes: 81 additions & 2 deletions example/backend-service/echo/echo.go
Original file line number Diff line number Diff line change
@@ -1,14 +1,17 @@
package main

import (
"bufio"
"fmt"
"io"
"log"
"net"
"net/http"
"os"
"time"
)

// TeeWriter is an io.Writer wapper.
// TeeWriter is an io.Writer wrapper.
type TeeWriter struct {
writers []io.Writer
}
Expand All @@ -26,7 +29,7 @@ func (tw *TeeWriter) Write(p []byte) (n int, err error) {
return len(p), nil
}

func main() {
func httpServer() {
echoHandler := func(w http.ResponseWriter, req *http.Request) {
time.Sleep(10 * time.Millisecond)
body, err := io.ReadAll(req.Body)
Expand Down Expand Up @@ -60,3 +63,79 @@ func main() {
http.ListenAndServe(":9095", nil)
fmt.Println("listen and serve failed")
}

func tcpServer() {
echoHandler := func(conn net.Conn) {
time.Sleep(10 * time.Millisecond)
reader := bufio.NewReader(conn)
for {
message, err := reader.ReadString('\n')
if err != nil {
conn.Close()
return
}
fmt.Println("Message incoming: ", string(message))
responseMsg := []byte(
"\nYour Message \n" +
"============== \n" +
"Message incoming: " + string(message) + "\n",
)
conn.Write(responseMsg)
}
}

listener, err := net.Listen("tcp", "127.0.0.1:9095")
if err != nil {
log.Fatal(err)
}
defer listener.Close()

for {
conn, err := listener.Accept()
if err != nil {
log.Fatal(err)
}
go echoHandler(conn)
}
}

func udpServer() {
echoHandler := func(pc net.PacketConn, addr net.Addr, buf []byte) {
time.Sleep(10 * time.Millisecond)

fmt.Println("Your Message")
fmt.Println("==============")
fmt.Printf("Message incoming: %s \n", string(buf))

pc.WriteTo(buf, addr)
}
pc, err := net.ListenPacket("udp", ":9095")
if err != nil {
log.Fatal(err)
}
defer pc.Close()

for {
buf := make([]byte, 1024)
n, addr, err := pc.ReadFrom(buf)
if err != nil {
continue
}
go echoHandler(pc, addr, buf[:n])
}
}

func main() {
protocol := "http"
if len(os.Args) > 1 {
protocol = os.Args[1]
}
switch protocol {
case "tcp":
tcpServer()
case "udp":
udpServer()
default:
httpServer()
}
}
83 changes: 83 additions & 0 deletions example/client/tcp_udp.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,83 @@
package main

import (
"bufio"
"fmt"
"net"
"os"
)

func tcpClient() {
strEcho := "Hello from client! \n"
servAddr := "127.0.0.1:10080"
if len(os.Args) > 2 {
servAddr = os.Args[2]
}
tcpAddr, err := net.ResolveTCPAddr("tcp", servAddr)
if err != nil {
fmt.Println("ResolveTCPAddr failed:", err.Error())
os.Exit(1)
}

conn, err := net.DialTCP("tcp", nil, tcpAddr)
if err != nil {
fmt.Println("Dial failed:", err.Error())
os.Exit(1)
}

_, err = conn.Write([]byte(strEcho))
if err != nil {
fmt.Println("Write to server failed:", err.Error())
os.Exit(1)
}

fmt.Println("write to server = ", strEcho)

reply := make([]byte, 1024)

_, err = conn.Read(reply)
if err != nil {
fmt.Println("Write to server failed:", err.Error())
os.Exit(1)
}

fmt.Println("reply from server=", string(reply))

_ = conn.Close()
}

func udpClient() {
p := make([]byte, 2048)
servAddr := "127.0.0.1:10070"
if len(os.Args) > 2 {
servAddr = os.Args[2]
}
conn, err := net.Dial("udp", servAddr)
if err != nil {
fmt.Printf("Some error %v", err)
return
}
_, _ = fmt.Fprintf(conn, "Ping from client")
_, err = bufio.NewReader(conn).Read(p)
if err == nil {
fmt.Printf("%s\n", p)
} else {
fmt.Printf("Some error %v\n", err)
}
_ = conn.Close()
}

func main() {
protocol := ""
if len(os.Args) > 1 {
protocol = os.Args[1]
}
switch protocol {
case "tcp":
tcpClient()
case "udp":
udpClient()
default:
fmt.Println("Please provide udp or tcp flag.")
}
}

0 comments on commit 97b8f1a

Please sign in to comment.