mirror of
https://github.com/shadow1ng/fscan.git
synced 2025-09-14 14:06:44 +08:00

- 新增common/network.go统一网络操作包装器 - 重构MySQL/FTP/SSH/SNMP插件使用统一包装器 - 简化发包控制逻辑,避免重复代码 - 为未来代理、重试等功能扩展奠定基础
90 lines
2.6 KiB
Go
90 lines
2.6 KiB
Go
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)
|
||
} |