package common import ( "fmt" "net" "net/http" "time" ) /* network.go - 统一网络操作包装器 提供带发包控制、统计和代理支持的统一网络操作接口。 消除在每个插件中重复添加发包控制检查的需要。 */ // ============================================================================= // 统一网络连接包装器 // ============================================================================= // SafeDialTimeout 带发包控制的TCP连接 // 自动处理发包限制检查和统计计数 func SafeDialTimeout(network, address string, timeout time.Duration) (net.Conn, error) { // 检查发包限制 if canSend, reason := CanSendPacket(); !canSend { LogError(fmt.Sprintf("网络连接 %s 受限: %s", address, reason)) return nil, fmt.Errorf("发包受限: %s", reason) } // 建立连接 - 支持SOCKS5代理 // 注意:WrapperTcpWithTimeout内部已经有计数逻辑,这里不重复计数 conn, err := WrapperTcpWithTimeout(network, address, timeout) return conn, err } // SafeUDPDial 带发包控制的UDP连接 func SafeUDPDial(network, address string, timeout time.Duration) (net.Conn, error) { // 检查发包限制 if canSend, reason := CanSendPacket(); !canSend { LogError(fmt.Sprintf("UDP连接 %s 受限: %s", address, reason)) return nil, fmt.Errorf("发包受限: %s", reason) } // 建立UDP连接 conn, err := net.DialTimeout(network, address, timeout) // 统计UDP包数量 if err == nil { IncrementUDPPacketCount() } return conn, err } // SafeHTTPDo 带发包控制的HTTP请求 func SafeHTTPDo(client *http.Client, req *http.Request) (*http.Response, error) { // 检查发包限制 if canSend, reason := CanSendPacket(); !canSend { LogError(fmt.Sprintf("HTTP请求 %s 受限: %s", req.URL.String(), reason)) return nil, fmt.Errorf("发包受限: %s", reason) } // 执行HTTP请求 resp, err := client.Do(req) // 统计TCP包数量 (HTTP本质上是TCP) if err != nil { IncrementTCPFailedPacketCount() } else { IncrementTCPSuccessPacketCount() } return resp, err } // ============================================================================= // 便捷函数封装 // ============================================================================= // SafeTCPDial TCP连接的便捷封装 func SafeTCPDial(address string, timeout time.Duration) (net.Conn, error) { return SafeDialTimeout("tcp", address, timeout) } // SafeTCPDialContext 带Context的TCP连接 func SafeTCPDialContext(network, address string, timeout time.Duration) (net.Conn, error) { // 这个函数为将来扩展Context支持预留 return SafeDialTimeout(network, address, timeout) }