tools.go_stun
2020-04-05
Child:4b125c1ef311
tools.go_stun/main.go
.. init
| awgur@0 | 1 package main |
| awgur@0 | 2 |
| awgur@0 | 3 import ( |
| awgur@0 | 4 "errors" |
| awgur@0 | 5 "fmt" |
| awgur@0 | 6 "log/syslog" |
| awgur@0 | 7 "net" |
| awgur@0 | 8 "os" |
| awgur@0 | 9 "strings" |
| awgur@0 | 10 "time" |
| awgur@0 | 11 ) |
| awgur@0 | 12 |
| awgur@0 | 13 const ( |
| awgur@0 | 14 LOG_IDENT string = "net.a0fs.gostun" |
| awgur@0 | 15 ) |
| awgur@0 | 16 |
| awgur@0 | 17 func getPort() (res string, err error) { |
| awgur@0 | 18 if len(os.Args) < 2 { |
| awgur@0 | 19 err = errors.New("No port specify") |
| awgur@0 | 20 } else { |
| awgur@0 | 21 res = fmt.Sprintf(":%s", os.Args[1]) |
| awgur@0 | 22 } |
| awgur@0 | 23 return |
| awgur@0 | 24 } |
| awgur@0 | 25 |
| awgur@0 | 26 func fail(code int, msg string) { |
| awgur@0 | 27 usage := "Usage: cmd port" |
| awgur@0 | 28 usage += "\n port: port number for listening clients" |
| awgur@0 | 29 |
| awgur@0 | 30 fmt.Fprintln(os.Stderr, msg) |
| awgur@0 | 31 fmt.Fprintln(os.Stderr, usage) |
| awgur@0 | 32 os.Exit(code) |
| awgur@0 | 33 return |
| awgur@0 | 34 } |
| awgur@0 | 35 |
| awgur@0 | 36 func handler(conn net.Conn) { |
| awgur@0 | 37 log, err := syslog.New(syslog.LOG_USER, LOG_IDENT) |
| awgur@0 | 38 if err != nil { |
| awgur@0 | 39 panic(err) |
| awgur@0 | 40 } |
| awgur@0 | 41 |
| awgur@0 | 42 _s_tm := time.Now() |
| awgur@0 | 43 remoteAddr := conn.RemoteAddr().String() |
| awgur@0 | 44 |
| awgur@0 | 45 defer func() { |
| awgur@0 | 46 var err error |
| awgur@0 | 47 _s_tmd := time.Now().Sub(_s_tm) |
| awgur@0 | 48 if r_err := recover(); r_err != nil { |
| awgur@0 | 49 err = log.Err(fmt.Sprintf("Error on service for %s (service time: %v): %v", remoteAddr, _s_tmd, r_err)) |
| awgur@0 | 50 if err != nil { |
| awgur@0 | 51 panic(err) |
| awgur@0 | 52 } |
| awgur@0 | 53 } else { |
| awgur@0 | 54 err = conn.Close() |
| awgur@0 | 55 if err != nil { |
| awgur@0 | 56 err = log.Err(fmt.Sprintf("Error on closing socket when service %s (service time: %v): %v", |
| awgur@0 | 57 remoteAddr, _s_tmd, err)) |
| awgur@0 | 58 |
| awgur@0 | 59 if err != nil { |
| awgur@0 | 60 panic(err) |
| awgur@0 | 61 } |
| awgur@0 | 62 } else { |
| awgur@0 | 63 err = log.Info(fmt.Sprintf("Ok service %s in %v", remoteAddr, _s_tmd)) |
| awgur@0 | 64 if err != nil { |
| awgur@0 | 65 panic(err) |
| awgur@0 | 66 } |
| awgur@0 | 67 } |
| awgur@0 | 68 } |
| awgur@0 | 69 |
| awgur@0 | 70 }() |
| awgur@0 | 71 |
| awgur@0 | 72 addr_spit := strings.Split(remoteAddr, ":") |
| awgur@0 | 73 addr_last := len(addr_spit) - 1 |
| awgur@0 | 74 addr := "IP: " + strings.Join(addr_spit[:addr_last], ":") + "\n" |
| awgur@0 | 75 port := "Port: " + addr_spit[addr_last] + "\n" |
| awgur@0 | 76 |
| awgur@0 | 77 if _, err := conn.Write([]byte(addr)); err != nil { |
| awgur@0 | 78 panic(err) |
| awgur@0 | 79 } |
| awgur@0 | 80 if _, err := conn.Write([]byte(port)); err != nil { |
| awgur@0 | 81 panic(err) |
| awgur@0 | 82 } |
| awgur@0 | 83 } |
| awgur@0 | 84 |
| awgur@0 | 85 func main() { |
| awgur@0 | 86 port, err := getPort() |
| awgur@0 | 87 if err != nil { |
| awgur@0 | 88 fail(1, fmt.Sprint("Error in parsing port number: ", err)) |
| awgur@0 | 89 } |
| awgur@0 | 90 |
| awgur@0 | 91 svc, err := net.Listen("tcp", port) |
| awgur@0 | 92 if err != nil { |
| awgur@0 | 93 fail(2, fmt.Sprint("Fail to open socket: ", err)) |
| awgur@0 | 94 } |
| awgur@0 | 95 |
| awgur@0 | 96 for { |
| awgur@0 | 97 conn, err := svc.Accept() |
| awgur@0 | 98 if err != nil { |
| awgur@0 | 99 fail(1, fmt.Sprint("Error accepting connections: ", err)) |
| awgur@0 | 100 } |
| awgur@0 | 101 go handler(conn) |
| awgur@0 | 102 } |
| awgur@0 | 103 } |