Single connection, parallel goroutines for RX/TX, error handling

This commit is contained in:
Alex Denes 2022-04-05 05:08:46 +00:00
parent 4d44f9e897
commit d68e54c1df

View File

@ -12,7 +12,7 @@ import (
"github.com/net-byte/vtun/common/netutil"
"github.com/net-byte/vtun/tun"
"github.com/songgao/water"
"github.com/songgao/water/waterutil"
//"github.com/songgao/water/waterutil"
)
// Start websocket client
@ -34,45 +34,32 @@ func StartClient(config config.Config) {
func wsToTun(wg *sync.WaitGroup, config config.Config, wsconn net.Conn, iface *water.Interface) {
defer wg.Done()
for {
var packet []byte
var err error
wsconn.SetReadDeadline(time.Now().Add(time.Duration(config.Timeout) * time.Second))
packet, err = wsutil.ReadServerBinary(wsconn)
packet, err := wsutil.ReadServerBinary(wsconn)
if err != nil {
break
}
if config.Obfs {
packet = cipher.XOR(packet)
}
if !waterutil.IsIPv4(packet) {
continue
}
iface.Write(packet)
}
}
func tunToWs(wg *sync.WaitGroup, config config.Config, wsconn net.Conn, iface *water.Interface) {
defer wg.Done()
packet := make([]byte, 0, config.MTU)
packet := make([]byte, config.MTU)
for {
n, err := iface.Read(packet)
if err != nil || n == 0 {
break
}
packet = packet[:n]
if !waterutil.IsIPv4(packet) {
continue
}
srcIPv4, dstIPv4 := netutil.GetIPv4(packet)
if srcIPv4 == "" || dstIPv4 == "" {
continue
}
b := packet[:n]
if config.Obfs {
packet = cipher.XOR(packet)
}
wsconn.SetWriteDeadline(time.Now().Add(time.Duration(config.Timeout) * time.Second))
err = wsutil.WriteClientBinary(wsconn, packet)
if err != nil {
if err = wsutil.WriteClientBinary(wsconn, b); err != nil {
break
}
}