tools.go_stun

Yohn Y. 2020-04-06 Parent:4b125c1ef311 Child:102fbdab34d8

2:6455d3067db1 Go to Latest

tools.go_stun/main.go

+ Добавил разрешение имён. Просто так

History
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@1 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@1 51 panic(err.Error())
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@1 60 panic(err.Error())
awgur@0 61 }
awgur@0 62 } else {
awgur@1 63 _ = log.Info(fmt.Sprintf("Ok service %s in %v", remoteAddr, _s_tmd))
awgur@0 64 }
awgur@0 65 }
awgur@0 66 }()
awgur@0 67
awgur@0 68 addr_spit := strings.Split(remoteAddr, ":")
awgur@0 69 addr_last := len(addr_spit) - 1
awgur@2 70 addr := strings.Join(addr_spit[:addr_last], ":")
awgur@2 71
awgur@2 72 var dns string
awgur@2 73 dns_names, err := net.LookupAddr(strings.Trim(addr, "[] "))
awgur@2 74 if err != nil {
awgur@2 75 log.Warning(fmt.Sprintf("Fail to resolve dns name for %s: %v", remoteAddr, err))
awgur@2 76 } else {
awgur@2 77 for _, dns_name := range dns_names {
awgur@2 78 dns += "Name: " + dns_name + "\n"
awgur@2 79 }
awgur@2 80 }
awgur@2 81 addr = "IP: " + addr + "\n"
awgur@0 82 port := "Port: " + addr_spit[addr_last] + "\n"
awgur@0 83
awgur@0 84 if _, err := conn.Write([]byte(addr)); err != nil {
awgur@1 85 panic(err.Error())
awgur@0 86 }
awgur@2 87 if _, err := conn.Write([]byte(dns)); err != nil {
awgur@2 88 panic(err.Error())
awgur@2 89 }
awgur@0 90 if _, err := conn.Write([]byte(port)); err != nil {
awgur@1 91 panic(err.Error())
awgur@0 92 }
awgur@0 93 }
awgur@0 94
awgur@0 95 func main() {
awgur@0 96 port, err := getPort()
awgur@0 97 if err != nil {
awgur@0 98 fail(1, fmt.Sprint("Error in parsing port number: ", err))
awgur@0 99 }
awgur@0 100
awgur@0 101 svc, err := net.Listen("tcp", port)
awgur@0 102 if err != nil {
awgur@0 103 fail(2, fmt.Sprint("Fail to open socket: ", err))
awgur@0 104 }
awgur@0 105
awgur@0 106 for {
awgur@0 107 conn, err := svc.Accept()
awgur@0 108 if err != nil {
awgur@0 109 fail(1, fmt.Sprint("Error accepting connections: ", err))
awgur@0 110 }
awgur@0 111 go handler(conn)
awgur@0 112 }
awgur@0 113 }