make parsing generic

This commit is contained in:
xtaci
2022-10-08 17:47:14 +08:00
parent f7a642525c
commit b9cb84efdf
2 changed files with 56 additions and 24 deletions
+6 -24
View File
@@ -2,11 +2,10 @@ package main
import (
"fmt"
"regexp"
"strconv"
"github.com/pkg/errors"
kcp "github.com/xtaci/kcp-go/v5"
"github.com/xtaci/kcptun/generic"
"github.com/xtaci/tcpraw"
)
@@ -17,30 +16,13 @@ func dial(config *Config, block kcp.BlockCrypt) (*kcp.UDPSession, error) {
dialCount++
}()
remoteAddrMatcher := regexp.MustCompile(`(.*)\:([0-9]{1,5})-?([0-9]{1,5})?`)
matches := remoteAddrMatcher.FindStringSubmatch(config.RemoteAddr)
var remoteAddr string
if len(matches) == 3 { // single port
remoteAddr = config.RemoteAddr
} else if len(matches) == 4 { // multi port
minPort, err := strconv.Atoi(matches[2])
if err != nil {
return nil, err
}
maxPort, err := strconv.Atoi(matches[3])
if err != nil {
return nil, err
}
if (minPort > maxPort) || minPort > 65535 || maxPort > 65535 || minPort == 0 || maxPort == 0 {
return nil, errors.Errorf("invalid port range specified: minport:%v -> maxport %v", minPort, maxPort)
}
// assign remote addr
remoteAddr = fmt.Sprintf("%v:%v", matches[1], uint64(minPort)+dialCount%uint64(maxPort-minPort+1))
mp, err := generic.ParseMultiPort(config.RemoteAddr)
if err != nil {
return nil, err
}
remoteAddr := fmt.Sprintf("%v:%v", mp.Host, uint64(mp.MinPort)+dialCount%uint64(mp.MaxPort-mp.MinPort+1))
if config.TCP {
conn, err := tcpraw.Dial("tcp", remoteAddr)
if err != nil {
+50
View File
@@ -0,0 +1,50 @@
package generic
import (
"regexp"
"strconv"
"github.com/pkg/errors"
)
type MultiPort struct {
Host string
MinPort uint64
MaxPort uint64
}
// Parse mulitport listener or dialer
func ParseMultiPort(addr string) (*MultiPort, error) {
remoteAddrMatcher := regexp.MustCompile(`(.*)\:([0-9]{1,5})-?([0-9]{1,5})?`)
matches := remoteAddrMatcher.FindStringSubmatch(addr)
if len(matches) >= 3 {
var minPort, maxPort int
minPort, err := strconv.Atoi(matches[2])
if err != nil {
return nil, err
}
maxPort = minPort
// multiport assignment
if len(matches) >= 4 {
maxPort, err = strconv.Atoi(matches[3])
if err != nil {
return nil, err
}
}
if (minPort > maxPort) || minPort > 65535 || maxPort > 65535 || minPort == 0 || maxPort == 0 {
return nil, errors.Errorf("invalid port range specified: minport:%v -> maxport %v", minPort, maxPort)
}
mp := new(MultiPort)
mp.Host = matches[1]
mp.MinPort = uint64(minPort)
mp.MaxPort = uint64(maxPort)
return mp, nil
}
return nil, errors.Errorf("malformed address:%v", addr)
}