tools.go_stun

Yohn Y. 2020-04-05 Child:4b125c1ef311

0:bfbb685d7758 Browse Files

.. init

main.go

     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 +}