From 5bf90d1b6328c9785c9c92dd84708b29847b8753 Mon Sep 17 00:00:00 2001 From: jixishi Date: Fri, 19 Apr 2024 22:42:28 +0800 Subject: [PATCH] =?UTF-8?q?TCP|UDP=20=E5=AE=A2=E6=88=B7=E7=AB=AF=E6=95=B0?= =?UTF-8?q?=E6=8D=AE=E8=BD=AC=E5=8F=91=E6=94=AF=E6=8C=81=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- command.go | 2 +- config.go | 40 +++++++++++++++++++++++++++++++++++++++- flag.go | 4 +++- main.go | 51 +++++++++++++++++++++++++++++++++++---------------- 4 files changed, 78 insertions(+), 19 deletions(-) diff --git a/command.go b/command.go index 45b1ea7..1183f21 100644 --- a/command.go +++ b/command.go @@ -20,7 +20,7 @@ func cmdhelp() { var page = 0 fmt.Printf(">-------Help(%v)-------<\n", page) for i := 0; i < len(commands); i++ { - strout(config.outputCode, fmt.Sprintf(" %-10v --%v\n", commands[i].name, commands[i].description)) + strout(out, config.outputCode, fmt.Sprintf(" %-10v --%v\n", commands[i].name, commands[i].description)) } } func cmdexit() { diff --git a/config.go b/config.go index 5aca70e..c3745c6 100644 --- a/config.go +++ b/config.go @@ -1,16 +1,54 @@ package main +import ( + "log" + "net" +) + type Config struct { portName string baudRate int dataBits int stopBits int + parityBit int outputCode string inputCode string endStr string enableLog bool logFilePath string - parityBit int + forWard int + address string } +type FoeWardMode int + +const ( + NOT FoeWardMode = iota + TCPS + TCPC + UDPS + UDPC +) var config Config + +func setForWard() (conn net.Conn) { + switch FoeWardMode(config.forWard) { + case TCPS: + + case TCPC: + conn, err = net.Dial("tcp", config.address) + if err != nil { + log.Fatal(err) + } + case UDPS: + + case UDPC: + conn, err = net.Dial("udp", config.address) + if err != nil { + log.Fatal(err) + } + default: + panic("未知模式设置") + } + return conn +} diff --git a/flag.go b/flag.go index 2cff873..973d59b 100644 --- a/flag.go +++ b/flag.go @@ -38,8 +38,10 @@ var ( endStr = Flag{ptrVal{string: &config.endStr}, "e", "end", Val{string: "\n"}, "终端换行符"} enableLog = Flag{ptrVal{bool: &config.enableLog}, "l", "log", Val{bool: false}, "是否启用日志保存"} logFilePath = Flag{ptrVal{string: &config.logFilePath}, "P", "Path", Val{string: "./Log.txt"}, "日志保存路径"} + forWard = Flag{ptrVal{int: &config.forWard}, "f", "forward", Val{int: 0}, "转发模式(0: 无 1:TCP-S 2:TCP-C 3:UDP-S 4:UDP-C)"} + address = Flag{ptrVal{string: &config.address}, "a", "address", Val{string: "127.0.0.1:12345"}, "转发服务地址"} parityBit = Flag{ptrVal{int: &config.parityBit}, "v", "verify", Val{int: 0}, "奇偶校验(0:无校验、1:奇校验、2:偶校验、3:1校验、4:0校验)"} - flags = []Flag{portName, baudRate, dataBits, stopBits, outputCode, inputCode, endStr, enableLog, logFilePath, parityBit} + flags = []Flag{portName, baudRate, dataBits, stopBits, outputCode, inputCode, endStr, enableLog, logFilePath, forWard, address, parityBit} ) type ValType int diff --git a/main.go b/main.go index 32307bc..1ac5c47 100644 --- a/main.go +++ b/main.go @@ -18,6 +18,13 @@ var ( args []string ) +var ( + in io.Reader = os.Stdin + out io.Writer = os.Stdout + ins = []io.Reader{os.Stdin} + outs = []io.Writer{os.Stdout} +) + func checkPortAvailability(name string) ([]string, error) { ports, err := serial.GetPortsList() if err != nil { @@ -45,8 +52,8 @@ func init() { cmdinit() } -func input() { - input := bufio.NewScanner(os.Stdin) +func input(in io.Reader) { + input := bufio.NewScanner(in) var ok = false for input.Scan() { ok = false @@ -74,8 +81,8 @@ func input() { } } -func strout(cs, str string) { - err = charsetconv.EncodeWith(strings.NewReader(str), os.Stdout, charsetconv.Charset(cs), false) +func strout(out io.Writer, cs, str string) { + err = charsetconv.EncodeWith(strings.NewReader(str), out, charsetconv.Charset(cs), false) if err != nil { log.Fatal(err) } @@ -83,10 +90,13 @@ func strout(cs, str string) { func output(out io.Writer) { if strings.Compare(config.inputCode, "hex") == 0 { - b, _ := bufio.NewReader(io.LimitReader(serialPort, 16)).Peek(16) - _, err = fmt.Fprintf(out, "% X %q \n", b, b) + b := make([]byte, 16) + r, _ := io.LimitReader(serialPort, 16).Read(b) + if r != 0 { + strout(out, config.outputCode, fmt.Sprintf("% X %q \n", b, b)) + } } else { - err = charsetconv.ConvertWith(io.LimitReader(serialPort, 1024), charsetconv.Charset(config.inputCode), out, charsetconv.Charset(config.outputCode), false) + err = charsetconv.ConvertWith(serialPort, charsetconv.Charset(config.inputCode), out, charsetconv.Charset(config.outputCode), false) } if err != nil { log.Fatal(err) @@ -116,20 +126,29 @@ func main() { } }(serialPort) - go input() + if FoeWardMode(config.forWard) != NOT { + conn := setForWard() + ins = append(ins, conn) + outs = append(outs, conn) + defer conn.Close() + } + + if len(ins) != 1 { + in = io.MultiReader(ins...) + } + go input(in) if config.enableLog { f, err := os.OpenFile(config.logFilePath, os.O_RDWR|os.O_APPEND|os.O_CREATE, 0666) if err != nil { log.Fatal(err) } - out := io.MultiWriter(os.Stdout, f) - for { - output(out) - } - } else { - for { - output(os.Stdout) - } + outs = append(outs, f) + } + if len(outs) != 1 { + out = io.MultiWriter(outs...) + } + for { + output(out) } }