tools.go_stun
2020-04-05
Child:4b125c1ef311
0:bfbb685d7758 Browse Files
.. init
1.1 --- /dev/null Thu Jan 01 00:00:00 1970 +0000 1.2 +++ b/main.go Sun Apr 05 19:17:10 2020 +0300 1.3 @@ -0,0 +1,103 @@ 1.4 +package main 1.5 + 1.6 +import ( 1.7 + "errors" 1.8 + "fmt" 1.9 + "log/syslog" 1.10 + "net" 1.11 + "os" 1.12 + "strings" 1.13 + "time" 1.14 +) 1.15 + 1.16 +const ( 1.17 + LOG_IDENT string = "net.a0fs.gostun" 1.18 +) 1.19 + 1.20 +func getPort() (res string, err error) { 1.21 + if len(os.Args) < 2 { 1.22 + err = errors.New("No port specify") 1.23 + } else { 1.24 + res = fmt.Sprintf(":%s", os.Args[1]) 1.25 + } 1.26 + return 1.27 +} 1.28 + 1.29 +func fail(code int, msg string) { 1.30 + usage := "Usage: cmd port" 1.31 + usage += "\n port: port number for listening clients" 1.32 + 1.33 + fmt.Fprintln(os.Stderr, msg) 1.34 + fmt.Fprintln(os.Stderr, usage) 1.35 + os.Exit(code) 1.36 + return 1.37 +} 1.38 + 1.39 +func handler(conn net.Conn) { 1.40 + log, err := syslog.New(syslog.LOG_USER, LOG_IDENT) 1.41 + if err != nil { 1.42 + panic(err) 1.43 + } 1.44 + 1.45 + _s_tm := time.Now() 1.46 + remoteAddr := conn.RemoteAddr().String() 1.47 + 1.48 + defer func() { 1.49 + var err error 1.50 + _s_tmd := time.Now().Sub(_s_tm) 1.51 + if r_err := recover(); r_err != nil { 1.52 + err = log.Err(fmt.Sprintf("Error on service for %s (service time: %v): %v", remoteAddr, _s_tmd, r_err)) 1.53 + if err != nil { 1.54 + panic(err) 1.55 + } 1.56 + } else { 1.57 + err = conn.Close() 1.58 + if err != nil { 1.59 + err = log.Err(fmt.Sprintf("Error on closing socket when service %s (service time: %v): %v", 1.60 + remoteAddr, _s_tmd, err)) 1.61 + 1.62 + if err != nil { 1.63 + panic(err) 1.64 + } 1.65 + } else { 1.66 + err = log.Info(fmt.Sprintf("Ok service %s in %v", remoteAddr, _s_tmd)) 1.67 + if err != nil { 1.68 + panic(err) 1.69 + } 1.70 + } 1.71 + } 1.72 + 1.73 + }() 1.74 + 1.75 + addr_spit := strings.Split(remoteAddr, ":") 1.76 + addr_last := len(addr_spit) - 1 1.77 + addr := "IP: " + strings.Join(addr_spit[:addr_last], ":") + "\n" 1.78 + port := "Port: " + addr_spit[addr_last] + "\n" 1.79 + 1.80 + if _, err := conn.Write([]byte(addr)); err != nil { 1.81 + panic(err) 1.82 + } 1.83 + if _, err := conn.Write([]byte(port)); err != nil { 1.84 + panic(err) 1.85 + } 1.86 +} 1.87 + 1.88 +func main() { 1.89 + port, err := getPort() 1.90 + if err != nil { 1.91 + fail(1, fmt.Sprint("Error in parsing port number: ", err)) 1.92 + } 1.93 + 1.94 + svc, err := net.Listen("tcp", port) 1.95 + if err != nil { 1.96 + fail(2, fmt.Sprint("Fail to open socket: ", err)) 1.97 + } 1.98 + 1.99 + for { 1.100 + conn, err := svc.Accept() 1.101 + if err != nil { 1.102 + fail(1, fmt.Sprint("Error accepting connections: ", err)) 1.103 + } 1.104 + go handler(conn) 1.105 + } 1.106 +}