commit 92e0da04578eca80160738cbc36f052c1493b280 Author: lvmaorui Date: Wed Mar 18 14:28:17 2020 +0800 test commnicate of ipc & rpc diff --git a/main.go b/main.go new file mode 100644 index 0000000..3b5ddee --- /dev/null +++ b/main.go @@ -0,0 +1,177 @@ +package main + +import ( + "encoding/binary" + "fmt" + "github.com/pborman/getopt/v2" + "io" + "io/ioutil" + "net" + "os" + "strings" + "time" +) + +const HeadSize int = 4 +func initServer(network,addr string) net.Listener { + + listener,err := net.Listen(network,addr) + if err != nil { + fmt.Println("Listener for",addr) + } + + return listener +} + +func testServer(listener net.Listener) { + defer listener.Close() + for { + unixConn, err := listener.Accept() + if err != nil { + continue + //return + } + + fmt.Println("A client connected : " + unixConn.RemoteAddr().String()) + unixPipe(unixConn) + } +} + +func unixPipe(conn io.ReadWriteCloser) { + defer conn.Close() + buf := make([]byte,1024*1024*10) + + for { + conn.Read(buf[:HeadSize]) + payloadLength := binary.LittleEndian.Uint32(buf) + length,err := conn.Read(buf[HeadSize : HeadSize+int(payloadLength)]) + if err != nil { + if err == io.EOF { + fmt.Println("read from client error=", err, "need to read len=", payloadLength) + } else { + fmt.Println("client disconnected=", err, "need to read len=", payloadLength) + } + return + } + + buf[0] = '@' + buf[1] = '#' + conn.Write(buf[:HeadSize+length]) + fmt.Println(time.Now(),"received len=",length) + } +} + +func initClient(network,addr string) io.ReadWriteCloser{ + conn, err := net.Dial(network, addr) + if err != nil { + fmt.Println("dialUnix err=", err) + } + + fmt.Println("connected!") + + return conn +} + +func testClient(conn io.ReadWriteCloser,content []byte,count int) { + + data := make([]byte, HeadSize+len(content)) + + dataLength := uint32(len(content)) + + binary.LittleEndian.PutUint32(data,dataLength) + + copy(data[HeadSize:], content) + + fmt.Println("client will send",data) + + buf := make([]byte,1024*1024*10) + var max,sum time.Duration + var min = time.Second * 100 + + for i := 0; i < count;i++ { + begin := time.Now() + conn.Write(data) + length, err := conn.Read(buf[:len(data)]) + if err != nil { + fmt.Println("read from server, error=",err) + return + } + + elapsed := time.Since(begin) + if max < elapsed { + max = elapsed + } + + if min > elapsed { + min = elapsed + } + + sum += elapsed + + fmt.Println("read use ",elapsed,"length=",length,buf[0],buf[1]) + time.Sleep(time.Millisecond *100) + } + + ave := time.Duration(int64(sum) / 1000) + fmt.Println("total use ","max=",max,"min=",min,"ave=",ave) +} + +func main() { + // Declare the flags to be used + helpFlag := getopt.Bool('h', "display help") + serverFlag := getopt.BoolLong("server", 's', "", "the command") + addrString := getopt.StringLong("address", 'a', "/tmp/unix_sock", "address") + countFlag := getopt.IntLong("count", 'c',1,"test count of loop") + textFlag := getopt.StringLong("text", 't',"00112233445566778899","text to send") + fileFlag := getopt.StringLong("file", 'f',"","read data from file to send") + //repeatFlag := getopt.StringLong("retransmit", 'r',"","address for retransmit data to next node") + + //:= getopt.BoolLong("server", 's', "", "the command") + + // Parse the program arguments + getopt.Parse() + // Get the remaining positional parameters + //args := getopt.Args() + if *helpFlag { + getopt.PrintUsage(os.Stdout) + return + } + + var network string + isUnixDomain := strings.ContainsRune(*addrString,'/') + if !isUnixDomain { + network = "tcp" + } else { + network = "unix" + if *serverFlag { + os.Remove(*addrString) + } + } + + sendContent := []byte(*textFlag) + fmt.Println("It will use :",network,*addrString) + if len(*fileFlag) > 0 { + f , err := os.Open(*fileFlag) + if err != nil { + fmt.Println("open file",*fileFlag,err) + return + } + + sendContent,err = ioutil.ReadAll(f) + + if err != nil { + fmt.Println("read file",*fileFlag,err) + return + } + } + + if *serverFlag { + listener := initServer(network,*addrString) + defer listener.Close() + testServer(listener) + } else { + conn := initClient(network,*addrString) + defer conn.Close() + testClient(conn,sendContent,*countFlag) + } +}