fscan/common/network.go
ZacharyZcR 5f7669a537 refactor: 引入统一网络包装器,提升发包控制一致性
- 新增common/network.go统一网络操作包装器
- 重构MySQL/FTP/SSH/SNMP插件使用统一包装器
- 简化发包控制逻辑,避免重复代码
- 为未来代理、重试等功能扩展奠定基础
2025-09-02 11:35:46 +00:00

90 lines
2.6 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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)
}