github.com/kelleygo/clashcore@v1.0.2/common/net/tcpip.go (about)

     1  package net
     2  
     3  import (
     4  	"fmt"
     5  	"net"
     6  	"strings"
     7  	"time"
     8  )
     9  
    10  var KeepAliveInterval = 15 * time.Second
    11  
    12  func SplitNetworkType(s string) (string, string, error) {
    13  	var (
    14  		shecme   string
    15  		hostPort string
    16  	)
    17  	result := strings.Split(s, "://")
    18  	if len(result) == 2 {
    19  		shecme = result[0]
    20  		hostPort = result[1]
    21  	} else if len(result) == 1 {
    22  		hostPort = result[0]
    23  	} else {
    24  		return "", "", fmt.Errorf("tcp/udp style error")
    25  	}
    26  
    27  	if len(shecme) == 0 {
    28  		shecme = "udp"
    29  	}
    30  
    31  	if shecme != "tcp" && shecme != "udp" {
    32  		return "", "", fmt.Errorf("scheme should be tcp:// or udp://")
    33  	} else {
    34  		return shecme, hostPort, nil
    35  	}
    36  }
    37  
    38  func SplitHostPort(s string) (host, port string, hasPort bool, err error) {
    39  	temp := s
    40  	hasPort = true
    41  
    42  	if !strings.Contains(s, ":") && !strings.Contains(s, "]:") {
    43  		temp += ":0"
    44  		hasPort = false
    45  	}
    46  
    47  	host, port, err = net.SplitHostPort(temp)
    48  	return
    49  }
    50  
    51  func TCPKeepAlive(c net.Conn) {
    52  	if tcp, ok := c.(*net.TCPConn); ok {
    53  		_ = tcp.SetKeepAlive(true)
    54  		_ = tcp.SetKeepAlivePeriod(KeepAliveInterval)
    55  	}
    56  }