mirror of
				https://github.com/e1732a364fed/v2ray_simple.git
				synced 2025-11-01 04:22:48 +08:00 
			
		
		
		
	修订代码
This commit is contained in:
		
							
								
								
									
										2
									
								
								cli.go
									
									
									
									
									
								
							
							
						
						
									
										2
									
								
								cli.go
									
									
									
									
									
								
							| @@ -663,10 +663,12 @@ func interactively_hotRemoveServerOrClient() { | |||||||
| 	will_delete_index = int(theInt) | 	will_delete_index = int(theInt) | ||||||
|  |  | ||||||
| 	if will_delete_dial { | 	if will_delete_dial { | ||||||
|  | 		allClients[will_delete_index].Stop() | ||||||
| 		allClients = utils.TrimSlice(allClients, will_delete_index) | 		allClients = utils.TrimSlice(allClients, will_delete_index) | ||||||
| 	} | 	} | ||||||
| 	if will_delete_listen { | 	if will_delete_listen { | ||||||
| 		listenerArray[will_delete_index].Close() | 		listenerArray[will_delete_index].Close() | ||||||
|  | 		allServers[will_delete_index].Stop() | ||||||
|  |  | ||||||
| 		allServers = utils.TrimSlice(allServers, will_delete_index) | 		allServers = utils.TrimSlice(allServers, will_delete_index) | ||||||
| 		listenerArray = utils.TrimSlice(listenerArray, will_delete_index) | 		listenerArray = utils.TrimSlice(listenerArray, will_delete_index) | ||||||
|   | |||||||
| @@ -42,6 +42,12 @@ func loopAccept(listener net.Listener, acceptFunc func(net.Conn)) { | |||||||
| // | // | ||||||
| // 非阻塞,在自己的goroutine中监听. | // 非阻塞,在自己的goroutine中监听. | ||||||
| func ListenAndAccept(network, addr string, acceptFunc func(net.Conn)) (listener net.Listener, err error) { | func ListenAndAccept(network, addr string, acceptFunc func(net.Conn)) (listener net.Listener, err error) { | ||||||
|  | 	if addr == "" || acceptFunc == nil { | ||||||
|  | 		return nil, utils.ErrNilParameter | ||||||
|  | 	} | ||||||
|  | 	if network == "" { | ||||||
|  | 		network = "tcp" | ||||||
|  | 	} | ||||||
| 	switch network { | 	switch network { | ||||||
| 	case "udp", "udp4", "udp6": | 	case "udp", "udp4", "udp6": | ||||||
| 		var ua *net.UDPAddr | 		var ua *net.UDPAddr | ||||||
| @@ -67,7 +73,6 @@ func ListenAndAccept(network, addr string, acceptFunc func(net.Conn)) (listener | |||||||
| 		if utils.FileExist(addr) { | 		if utils.FileExist(addr) { | ||||||
|  |  | ||||||
| 			if ce := utils.CanLogDebug("unix file exist"); ce != nil { | 			if ce := utils.CanLogDebug("unix file exist"); ce != nil { | ||||||
| 				//log.Println("unix file exist, deleting", addr) |  | ||||||
| 				ce.Write(zap.String("deleting", addr)) | 				ce.Write(zap.String("deleting", addr)) | ||||||
| 			} | 			} | ||||||
| 			err = os.Remove(addr) | 			err = os.Remove(addr) | ||||||
| @@ -79,9 +84,7 @@ func ListenAndAccept(network, addr string, acceptFunc func(net.Conn)) (listener | |||||||
| 		} | 		} | ||||||
| 		fallthrough | 		fallthrough | ||||||
| 	default: | 	default: | ||||||
| 		if network == "" { |  | ||||||
| 			network = "tcp" |  | ||||||
| 		} |  | ||||||
| 		listener, err = net.Listen(network, addr) | 		listener, err = net.Listen(network, addr) | ||||||
| 		if err != nil { | 		if err != nil { | ||||||
| 			return | 			return | ||||||
|   | |||||||
| @@ -1,7 +1,28 @@ | |||||||
| package netLayer | package netLayer | ||||||
|  |  | ||||||
| import "testing" | import ( | ||||||
|  | 	"net" | ||||||
|  | 	"testing" | ||||||
|  | 	"time" | ||||||
|  |  | ||||||
|  | 	"github.com/hahahrfool/v2ray_simple/utils" | ||||||
|  | ) | ||||||
|  |  | ||||||
| func TestIpv6(t *testing.T) { | func TestIpv6(t *testing.T) { | ||||||
| 	t.Log("HasIpv6Interface()", HasIpv6Interface()) | 	t.Log("HasIpv6Interface()", HasIpv6Interface()) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func TestUDP(t *testing.T) { | ||||||
|  | 	//测试setdeadline的情况. 实测证明 SetReadDeadline 在Read过程中也可以使用, 这样就可以防止阻塞 | ||||||
|  |  | ||||||
|  | 	laddr, _ := net.ResolveUDPAddr("udp", ":"+RandPortStr()) | ||||||
|  |  | ||||||
|  | 	udpConn, _ := net.ListenUDP("udp", laddr) | ||||||
|  |  | ||||||
|  | 	go func() { | ||||||
|  | 		time.Sleep(time.Second) | ||||||
|  | 		udpConn.SetReadDeadline(time.Now()) | ||||||
|  | 	}() | ||||||
|  | 	udpConn.ReadFrom(utils.GetPacket()) | ||||||
|  | 	t.Log("ok") | ||||||
|  | } | ||||||
|   | |||||||
| @@ -1,24 +0,0 @@ | |||||||
| package netLayer |  | ||||||
|  |  | ||||||
| import ( |  | ||||||
| 	"net" |  | ||||||
| 	"testing" |  | ||||||
| 	"time" |  | ||||||
|  |  | ||||||
| 	"github.com/hahahrfool/v2ray_simple/utils" |  | ||||||
| ) |  | ||||||
|  |  | ||||||
| func TestUDP(t *testing.T) { |  | ||||||
| 	//测试setdeadline的情况. 实测证明 SetReadDeadline 在Read过程中也可以使用, 这样就可以防止阻塞 |  | ||||||
|  |  | ||||||
| 	laddr, _ := net.ResolveUDPAddr("udp", ":"+RandPortStr()) |  | ||||||
|  |  | ||||||
| 	udpConn, _ := net.ListenUDP("udp", laddr) |  | ||||||
|  |  | ||||||
| 	go func() { |  | ||||||
| 		time.Sleep(time.Second) |  | ||||||
| 		udpConn.SetReadDeadline(time.Now()) |  | ||||||
| 	}() |  | ||||||
| 	udpConn.ReadFrom(utils.GetPacket()) |  | ||||||
| 	t.Log("ok") |  | ||||||
| } |  | ||||||
| @@ -5,6 +5,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"io" | 	"io" | ||||||
| 	"net" | 	"net" | ||||||
|  | 	"strings" | ||||||
|  |  | ||||||
| 	"github.com/hahahrfool/v2ray_simple/grpc" | 	"github.com/hahahrfool/v2ray_simple/grpc" | ||||||
| 	"github.com/hahahrfool/v2ray_simple/netLayer" | 	"github.com/hahahrfool/v2ray_simple/netLayer" | ||||||
| @@ -58,7 +59,8 @@ type Server interface { | |||||||
| } | } | ||||||
|  |  | ||||||
| // FullName 可以完整表示 一个 代理的 VSI 层级. | // FullName 可以完整表示 一个 代理的 VSI 层级. | ||||||
| // 这里认为, tcp/udp/kcp/raw_socket 是FirstName,具体的协议名称是 LastName, 中间层是 MiddleName | // 这里认为, tcp/udp/kcp/raw_socket 是FirstName,具体的协议名称是 LastName, 中间层是 MiddleName。 | ||||||
|  | // | ||||||
| // An Example of a full name:  tcp+tls+ws+vless | // An Example of a full name:  tcp+tls+ws+vless | ||||||
| func GetFullName(pc ProxyCommon) string { | func GetFullName(pc ProxyCommon) string { | ||||||
| 	return pc.Network() + pc.MiddleName() + pc.Name() | 	return pc.Network() + pc.MiddleName() + pc.Name() | ||||||
| @@ -135,14 +137,14 @@ type ProxyCommon interface { | |||||||
|  |  | ||||||
| 	initGRPC_server() error | 	initGRPC_server() error | ||||||
|  |  | ||||||
| 	IsMux() bool //如果用了grpc则此方法返回true | 	IsMux() bool //如果用了grpc或者quic, 则此方法返回true | ||||||
|  |  | ||||||
| 	GetQuic_Client() *quic.Client //for outClient | 	GetQuic_Client() *quic.Client //for outClient | ||||||
| 	setQuic_Client(*quic.Client) | 	setQuic_Client(*quic.Client) | ||||||
|  |  | ||||||
| 	setListenCommonConnFunc(func() (newConnChan chan net.Conn, baseConn any)) | 	setListenCommonConnFunc(func() (newConnChan chan net.Conn, baseConn any)) | ||||||
|  |  | ||||||
| 	/////////////////// 私有方法 /////////////////// | 	/////////////////// 其它私有方法 /////////////////// | ||||||
|  |  | ||||||
| 	setCantRoute(bool) | 	setCantRoute(bool) | ||||||
| 	setTag(string) | 	setTag(string) | ||||||
| @@ -214,14 +216,18 @@ func (pcs *ProxyCommonStruct) setFallback(a netLayer.Addr) { | |||||||
| } | } | ||||||
|  |  | ||||||
| func (pcs *ProxyCommonStruct) MiddleName() string { | func (pcs *ProxyCommonStruct) MiddleName() string { | ||||||
| 	str := "" | 	var sb strings.Builder | ||||||
|  | 	sb.WriteString("") | ||||||
|  |  | ||||||
| 	if pcs.TLS { | 	if pcs.TLS { | ||||||
| 		str += "+tls" | 		sb.WriteString("+tls") | ||||||
| 	} | 	} | ||||||
| 	if pcs.AdvancedL != "" { | 	if pcs.AdvancedL != "" { | ||||||
| 		str += "+" + pcs.AdvancedL | 		sb.WriteString("+") | ||||||
|  | 		sb.WriteString(pcs.AdvancedL) | ||||||
| 	} | 	} | ||||||
| 	return str + "+" | 	sb.WriteString("+") | ||||||
|  | 	return sb.String() | ||||||
| } | } | ||||||
|  |  | ||||||
| func (pcs *ProxyCommonStruct) CantRoute() bool { | func (pcs *ProxyCommonStruct) CantRoute() bool { | ||||||
| @@ -235,12 +241,12 @@ func (pcs *ProxyCommonStruct) GetTag() string { | |||||||
| func (pcs *ProxyCommonStruct) setTag(tag string) { | func (pcs *ProxyCommonStruct) setTag(tag string) { | ||||||
| 	pcs.Tag = tag | 	pcs.Tag = tag | ||||||
| } | } | ||||||
| func (pcs *ProxyCommonStruct) setNetwork(net string) { | func (pcs *ProxyCommonStruct) setNetwork(network string) { | ||||||
| 	if net == "" { | 	if network == "" { | ||||||
| 		pcs.network = "tcp" | 		pcs.network = "tcp" | ||||||
|  |  | ||||||
| 	} else { | 	} else { | ||||||
| 		pcs.network = net | 		pcs.network = network | ||||||
|  |  | ||||||
| 	} | 	} | ||||||
| } | } | ||||||
|   | |||||||
| @@ -45,15 +45,13 @@ func AllSubSets_improve1[T comparable](set []T) (subsets [][]T) { | |||||||
| 	return subsets | 	return subsets | ||||||
| } | } | ||||||
|  |  | ||||||
| func CopySlice[T any](a []T) (r []T) { | func DuplicateSlice[T any](a []T) (r []T) { | ||||||
| 	r = make([]T, len(a)) | 	r = make([]T, len(a)) | ||||||
| 	for i, v := range a { | 	copy(r, a) | ||||||
| 		r[i] = v |  | ||||||
| 	} |  | ||||||
| 	return | 	return | ||||||
| } | } | ||||||
|  |  | ||||||
| //会直接改动原slice数据 | // TrimSlice 从一个slice中移除一个元素, 会直接改动原slice数据 | ||||||
| func TrimSlice[T any](a []T, deleteIndex int) []T { | func TrimSlice[T any](a []T, deleteIndex int) []T { | ||||||
| 	j := 0 | 	j := 0 | ||||||
| 	for idx, val := range a { | 	for idx, val := range a { | ||||||
|   | |||||||
| @@ -12,14 +12,14 @@ var x = []string{"AA", "BB", "CC", "DD"} | |||||||
| var y = []int{1, 2, 3, 4} | var y = []int{1, 2, 3, 4} | ||||||
|  |  | ||||||
| func TestSplice(t *testing.T) { | func TestSplice(t *testing.T) { | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(x), 0)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(x), 0)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(x), 1)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(x), 1)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(x), 2)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(x), 2)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(x), 3)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(x), 3)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(y), 0)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(y), 0)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(y), 1)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(y), 1)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(y), 2)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(y), 2)) | ||||||
| 	t.Log(utils.TrimSlice(utils.CopySlice(y), 3)) | 	t.Log(utils.TrimSlice(utils.DuplicateSlice(y), 3)) | ||||||
| } | } | ||||||
|  |  | ||||||
| /* | /* | ||||||
|   | |||||||
| @@ -17,6 +17,7 @@ func init() { | |||||||
| 	rand.Seed(time.Now().Unix()) | 	rand.Seed(time.Now().Unix()) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // bufio.Reader 和 bytes.Buffer 都实现了 ByteReader | ||||||
| type ByteReader interface { | type ByteReader interface { | ||||||
| 	ReadByte() (byte, error) | 	ReadByte() (byte, error) | ||||||
| 	Read(p []byte) (n int, err error) | 	Read(p []byte) (n int, err error) | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 hahahrfool
					hahahrfool