tools.go_stun

Yohn Y. 2020-04-05 Parent:bfbb685d7758 Child:6455d3067db1

1:4b125c1ef311 Go to Latest

tools.go_stun/main.go

. Смена identity чтобы можно было фильтровать на платформе FreeBSD * Не падаем, если необходимо добавить информационное сообщение

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