来试试吧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

178 lines
3.8 KiB

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)
}
//add nothing for test
}