Improve: enhance error handling

This commit is contained in:
xjasonlyu
2023-03-27 00:43:39 +08:00
parent c61d7b5a20
commit 66860d3de8
2 changed files with 19 additions and 8 deletions
+9 -4
View File
@@ -47,18 +47,22 @@ func handleTCPConn(localConn adapter.TCPConn) {
defer targetConn.Close()
log.Infof("[TCP] %s <-> %s", metadata.SourceAddress(), metadata.DestinationAddress())
relay(localConn, targetConn) /* relay connections */
if err = relay(localConn, targetConn); err != nil {
log.Warnf("[TCP] %s <-> %s: %v", metadata.SourceAddress(), metadata.DestinationAddress(), err)
}
}
// relay copies between left and right bidirectionally.
func relay(left, right net.Conn) {
func relay(left, right net.Conn) error {
wg := sync.WaitGroup{}
wg.Add(2)
var leftErr, rightErr error
go func() {
defer wg.Done()
if err := copyBuffer(right, left); err != nil {
log.Warnf("[TCP] %v", err)
leftErr = errors.Join(leftErr, err)
}
right.SetReadDeadline(time.Now().Add(tcpWaitTimeout))
}()
@@ -66,12 +70,13 @@ func relay(left, right net.Conn) {
go func() {
defer wg.Done()
if err := copyBuffer(left, right); err != nil {
log.Warnf("[TCP] %v", err)
rightErr = errors.Join(rightErr, err)
}
left.SetReadDeadline(time.Now().Add(tcpWaitTimeout))
}()
wg.Wait()
return errors.Join(leftErr, rightErr)
}
func copyBuffer(dst io.Writer, src io.Reader) error {
+10 -4
View File
@@ -1,6 +1,7 @@
package tunnel
import (
"errors"
"io"
"net"
"sync"
@@ -57,28 +58,33 @@ func handleUDPConn(uc adapter.UDPConn) {
pc = newSymmetricNATPacketConn(pc, metadata)
log.Infof("[UDP] %s <-> %s", metadata.SourceAddress(), metadata.DestinationAddress())
relayPacket(uc, pc, remote)
if err = relayPacket(uc, pc, remote); err != nil {
log.Warnf("[TCP] %s <-> %s: %v", metadata.SourceAddress(), metadata.DestinationAddress(), err)
}
}
func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) {
func relayPacket(left net.PacketConn, right net.PacketConn, to net.Addr) error {
wg := sync.WaitGroup{}
wg.Add(2)
var leftErr, rightErr error
go func() {
defer wg.Done()
if err := copyPacketBuffer(right, left, to, _udpSessionTimeout); err != nil {
log.Warnf("[UDP] %v", err)
leftErr = errors.Join(leftErr, err)
}
}()
go func() {
defer wg.Done()
if err := copyPacketBuffer(left, right, nil, _udpSessionTimeout); err != nil {
log.Warnf("[UDP] %v", err)
rightErr = errors.Join(rightErr, err)
}
}()
wg.Wait()
return errors.Join(leftErr, rightErr)
}
func copyPacketBuffer(dst net.PacketConn, src net.PacketConn, to net.Addr, timeout time.Duration) error {