|
@@ -0,0 +1,79 @@
|
|
|
+package main
|
|
|
+
|
|
|
+import (
|
|
|
+ "flag"
|
|
|
+ "fmt"
|
|
|
+ "git.swzry.com/zry/SatorIPC/golang/sipc_conn"
|
|
|
+ "io"
|
|
|
+ "net"
|
|
|
+ "os"
|
|
|
+ "os/signal"
|
|
|
+ "sync"
|
|
|
+ "time"
|
|
|
+)
|
|
|
+
|
|
|
+func main() {
|
|
|
+ var isServer bool
|
|
|
+ var pipename string
|
|
|
+ flag.BoolVar(&isServer, "s", false, "Server mode")
|
|
|
+ flag.StringVar(&pipename, "p", sipc_conn.GeneratePath(), "Pipe name")
|
|
|
+ flag.Parse()
|
|
|
+ if isServer {
|
|
|
+ fmt.Println("Listen Pipe Name:", pipename)
|
|
|
+ c := make(chan os.Signal, 1)
|
|
|
+ signal.Notify(c, os.Interrupt, os.Kill)
|
|
|
+ server, err := sipc_conn.NewServer(pipename, false)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("CreateServerError:", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ server.SetConnErrorHandler(func(err error) {
|
|
|
+ fmt.Println("[Conn] Failed Handling Connection:", err.Error())
|
|
|
+ })
|
|
|
+ server.SetConnHandler(handleConnection)
|
|
|
+ err = server.Start()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("StartServerError:", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ s := <-c
|
|
|
+ err = server.Stop()
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("StopServerError:", err.Error())
|
|
|
+ }
|
|
|
+ fmt.Println("Program Quit By Signal:", s)
|
|
|
+ } else {
|
|
|
+ fmt.Println("Dial Pipe Name:", pipename)
|
|
|
+ conn, err := sipc_conn.Dial(pipename, 1*time.Second)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("DialError:", err.Error())
|
|
|
+ return
|
|
|
+ }
|
|
|
+ handleConnection(conn)
|
|
|
+ fmt.Println("Program End By Connection Lost.")
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
+func handleConnection(netconn net.Conn) {
|
|
|
+ wg := sync.WaitGroup{}
|
|
|
+ wg.Add(2)
|
|
|
+ go func() {
|
|
|
+ outs := os.Stdout
|
|
|
+ n, err := io.Copy(outs, netconn)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Recv IO Error:", err.Error())
|
|
|
+ }
|
|
|
+ fmt.Printf("%d byte(s) recieved.\n", n)
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ go func() {
|
|
|
+ ins := os.Stdin
|
|
|
+ n, err := io.Copy(netconn, ins)
|
|
|
+ if err != nil {
|
|
|
+ fmt.Println("Transmit IO Error:", err.Error())
|
|
|
+ }
|
|
|
+ fmt.Printf("%d byte(s) transmitted.\n", n)
|
|
|
+ wg.Done()
|
|
|
+ }()
|
|
|
+ wg.Wait()
|
|
|
+}
|