让 Go 的 context 取消 SOCKS 连接建立
为 Go 的 SOCKS 路径使用导出的 ContextDialer 接口,并把连接取消与后续应用流量的截止时间区分开。
func dialViaSOCKS(ctx context.Context, destination string) (net.Conn, error) {
dialer, err := proxy.SOCKS5(
"tcp",
"127.0.0.1:1080",
nil,
&net.Dialer{Timeout: 5 * time.Second},
)
if err != nil {
return nil, err
}
contextDialer, ok := dialer.(proxy.ContextDialer)
if !ok {
return nil, errors.New("SOCKS dialer lacks context support")
}
return contextDialer.DialContext(ctx, "tcp", destination)
}在已有的 Go 网络包中,使用 context、errors、net、time 和 x/net/proxy 导入。nil 参数表示不选择任何 SOCKS 凭据。对于允许的公共代理路由上的公共目标,SOCKS5 代理列表 为 dialer 的端点提供候选。
导出的 proxy.ContextDialer 断言让不受支持的实现显式失败。请检查已部署的依赖,而不是点名某个内部 dialer 类型,或启动调用方无法管理的阻塞 goroutine。
context 控制连接的建立。一旦返回 net.Conn,应施加适当的读/写或更高层请求的截止时间。基础 dialer 的连接超时与应用的总预算是不同的限制。
对于 HTTP 传输集成,保留其正常的 TLS 和 HTTP 行为。返回的、感知 context 的 SOCKS 流是交给传输层的交接,而不是响应,也不是之后所有字节的生命周期策略。