playit.gg go implementation #1

Open
Sirherobrine23 wants to merge 6 commits from breaked into main
37 changed files with 2167 additions and 1722 deletions
Showing only changes of commit 832fa79d47 - Show all commits

View File

@@ -24,8 +24,8 @@ type LocalLookup struct {
}
func (look *LocalLookup) Lookup(IP netip.Addr, Port uint16, Proto api.PortProto) *network.AddressValue[netip.AddrPort] {
look.AdreessLock.Lock()
defer look.AdreessLock.Unlock()
// look.AdreessLock.Lock()
// defer look.AdreessLock.Unlock()
for _, tunnel := range look.Adreess {
if tunnel.PortType != Proto && tunnel.PortType != "both" {
continue

View File

@@ -53,13 +53,14 @@ func (self *TunnelRunner) Run() chan error {
if 30_000 < time.Now().UnixMilli()-lastControlUpdate {
lastControlUpdate = now
if _, err := tunnel.ReloadControlAddr(); err != nil {
<-time.After(time.Second * 3)
continue
}
}
fmt.Println("Reciving new connection")
if new_client := tunnel.Update(); new_client != nil {
fmt.Println("New TCP Client")
found := self.Lookup.Lookup(new_client.ConnectAddr.Addr(), new_client.ConnectAddr.Port(), api.PortProto("tcp"))
if found == nil {
var found *network.AddressValue[netip.AddrPort]
if found = self.Lookup.Lookup(new_client.ConnectAddr.Addr(), new_client.ConnectAddr.Port(), api.PortProto("tcp")); found == nil {
fmt.Println("could not find local address for connection")
continue
}
@@ -77,6 +78,7 @@ func (self *TunnelRunner) Run() chan error {
defer tunnel_conn.Dropper.Drop()
if local_conn, err = network.TcpSocket(self.TcpClients.UseSpecialLAN, new_client.PeerAddr, netip.AddrPortFrom(found.Value.Addr(), (new_client.ConnectAddr.Port()-found.FromPort)+found.Value.Port())); err != nil {
fmt.Println(err)
return
}
defer local_conn.Close()
@@ -95,29 +97,28 @@ func (self *TunnelRunner) Run() chan error {
}()
}
}
end <- nil
}()
// go func(){
// udp := tunnel.UdpTunnel()
// for self.KeepRunning.Load() {
// buffer := make([]byte, 2048)
// fmt.Println("udp rec")
// rx, err := udp.ReceiveFrom(buffer)
// if err != nil {
// fmt.Println(err)
// time.Sleep(time.Second)
// continue
// }
// if rx.ConfirmerdConnection {
// continue
// }
// d,_:=json.MarshalIndent(rx, "", " ")
// fmt.Printf("rx: %s\n", string(d))
// bytes, flow := rx.ReceivedPacket.Bytes, rx.ReceivedPacket.Flow
// if err := self.UdpClients.ForwardPacket(flow, buffer[:bytes]); err != nil {
// panic(err)
// }
// }
// }()
go func() {
udp := tunnel.UdpTunnel()
for self.KeepRunning.Load() {
buffer := make([]byte, 2048)
fmt.Println("udp rec")
rx, err := udp.ReceiveFrom(buffer)
if err != nil {
fmt.Println(err)
time.Sleep(time.Second)
continue
}
if rx.ConfirmerdConnection {
continue
}
bytes, flow := rx.ReceivedPacket.Bytes, rx.ReceivedPacket.Flow
if err := self.UdpClients.ForwardPacket(flow, buffer[:bytes]); err != nil {
panic(err)
}
}
}()
return end
}

View File

@@ -163,6 +163,7 @@ func (self *SimpleTunnel) Update() *proto.NewClient {
if err := self.udpTunnel.SetUdpTunnel(details); err != nil {
panic(err)
}
return self.Update()
} else if content.Unauthorized {
self.controlChannel.SetExpired()
} else if pong := content.Pong; pong != nil {

View File

@@ -84,10 +84,10 @@ func (udp *UdpTunnel) RequiresAuth() bool {
func (udp *UdpTunnel) SetUdpTunnel(details *proto.UdpChannelDetails) error {
// LogDebug.Println("Updating Udp Tunnel")
udp.locker.Lock()
// udp.locker.Lock()
if current := udp.Details.Udp; current != nil {
if bytes.Equal(current.Token, details.Token) && current.TunnelAddr.Compare(details.TunnelAddr) == 0 {
udp.locker.Unlock()
// udp.locker.Unlock()
return nil
}
if current.TunnelAddr.Compare(details.TunnelAddr) != 0 {
@@ -99,7 +99,7 @@ func (udp *UdpTunnel) SetUdpTunnel(details *proto.UdpChannelDetails) error {
udp.Details.Udp = new(proto.UdpChannelDetails)
udp.Details.Udp.Token = details.Token
udp.Details.Udp.TunnelAddr = details.TunnelAddr
udp.locker.Unlock()
// udp.locker.Unlock()
return udp.SendToken(details)
}
@@ -115,8 +115,8 @@ func (udp *UdpTunnel) ResendToken() (bool, error) {
}
func (udp *UdpTunnel) SendToken(details *proto.UdpChannelDetails) error {
udp.locker.RLock()
defer udp.locker.RUnlock()
// udp.locker.RLock()
// defer udp.locker.RUnlock()
if details.TunnelAddr.Addr().Is4() {
if _, err := udp.Udp4.WriteToUDPAddrPort(details.Token, details.TunnelAddr); err != nil {
return err
@@ -135,8 +135,8 @@ func (udp *UdpTunnel) SendToken(details *proto.UdpChannelDetails) error {
}
func (udp *UdpTunnel) GetSock() (*net.UDPConn, *netip.AddrPort, error) {
udp.locker.RLock()
defer udp.locker.RUnlock()
// udp.locker.RLock()
// defer udp.locker.RUnlock()
lock := udp.Details
if lock.Udp == nil {
@@ -166,8 +166,8 @@ func (Udp *UdpTunnel) Send(data []byte, Flow UdpFlow) (int, error) {
}
func (Udp *UdpTunnel) GetToken() ([]byte, error) {
Udp.locker.RLock()
defer Udp.locker.RUnlock()
// Udp.locker.RLock()
// defer Udp.locker.RUnlock()
lock := Udp.Details
if lock.Udp == nil {
return nil, fmt.Errorf("udp tunnel not connected")
@@ -185,8 +185,8 @@ type UdpTunnelRx struct {
}
func (Udp *UdpTunnel) ReceiveFrom(buff []byte) (*UdpTunnelRx, error) {
Udp.locker.RLock()
defer Udp.locker.RUnlock()
// Udp.locker.RLock()
// defer Udp.locker.RUnlock()
udp, tunnelAddr, err := Udp.GetSock()
if err != nil {