func run(port, password, limit string) { ln, err := net.Listen("tcp", ":"+port) if err != nil { log.Printf("error listening port %v: %v\n", port, err) return } passwdManager.add(port, password, ln) var cipher *ss.Cipher log.Printf("server listening port %v with limit %v...\n", port, limit) for { if isOverFlow(port) { //fmt.Println(port, "流量超了!!") continue } conn, err := ln.Accept() if err != nil { // listener maybe closed to update password debug.Printf("accept error: %v\n", err) return } // Creating cipher upon first connection. if cipher == nil { log.Println("creating cipher for port:", port) cipher, err = ss.NewCipher(config.Method, password) if err != nil { log.Printf("Error generating cipher for port: %s %v\n", port, err) conn.Close() continue } } go handleConnection(ss.NewConn(conn, cipher.Copy()), port) } }
func runUDP(port, password, limit string) { var cipher *ss.Cipher port_i, _ := strconv.Atoi(port) log.Printf("listening udp port %v\n", port) conn, err := net.ListenUDP("udp", &net.UDPAddr{ IP: net.IPv6zero, Port: port_i, }) passwdManager.addUDP(port, password, conn) if err != nil { log.Printf("error listening udp port %v: %v\n", port, err) return } defer conn.Close() cipher, err = ss.NewCipher(config.Method, password) if err != nil { log.Printf("Error generating cipher for udp port: %s %v\n", port, err) conn.Close() } UDPConn := ss.NewUDPConn(conn, cipher.Copy()) for { UDPConn.ReadAndHandleUDPReq() } }