Fix DNS exchange failure and recursion deadlock in connector

Co-authored-by: everyx <lunt.luo@gmail.com>
This commit is contained in:
世界
2026-03-06 14:53:03 +08:00
parent c490e06b29
commit 23e2d28c21
5 changed files with 373 additions and 18 deletions

View File

@@ -1,8 +1,10 @@
package v2raygrpc
import (
"context"
"net"
"os"
"sync"
"time"
"github.com/sagernet/sing/common/baderror"
@@ -14,16 +16,19 @@ var _ net.Conn = (*GRPCConn)(nil)
type GRPCConn struct {
GunService
cache []byte
cache []byte
cancel context.CancelCauseFunc
closeOnce sync.Once
}
func NewGRPCConn(service GunService) *GRPCConn {
func NewGRPCConn(service GunService, cancel context.CancelCauseFunc) *GRPCConn {
//nolint:staticcheck
if client, isClient := service.(GunService_TunClient); isClient {
service = &clientConnWrapper{client}
}
return &GRPCConn{
GunService: service,
cancel: cancel,
}
}
@@ -54,6 +59,11 @@ func (c *GRPCConn) Write(b []byte) (n int, err error) {
}
func (c *GRPCConn) Close() error {
c.closeOnce.Do(func() {
if c.cancel != nil {
c.cancel(nil)
}
})
return nil
}