Skip to content

Go 库 API 参考

使用 LinkSocks 作为 Go 库的完整参考。

安装

bash
go get github.com/linksocks/linksocks

导入

go
import "github.com/linksocks/linksocks/linksocks"

服务器 API

创建服务器

go
// 默认服务器
server := linksocks.NewLinkSocksServer(linksocks.DefaultServerOption())

// 自定义配置
opt := linksocks.DefaultServerOption().
    WithWSHost("0.0.0.0").
    WithWSPort(8765).
    WithSocksHost("127.0.0.1").
    WithBufferSize(32768).
    WithFastOpen(true)

server := linksocks.NewLinkSocksServer(opt)

服务器选项

方法描述默认值
WithWSHost(host)WebSocket 监听地址"0.0.0.0"
WithWSPort(port)WebSocket 监听端口8765
WithSocksHost(host)SOCKS5 绑定地址"127.0.0.1"
WithPortPool(pool)反向代理的端口池自动生成
WithSocksWaitClient(wait)启动 SOCKS 前等待客户端true
WithBufferSize(size)数据传输缓冲区大小32768
WithAPI(key)使用密钥启用 HTTP API禁用
WithChannelTimeout(timeout)WebSocket 通道超时30s
WithConnectTimeout(timeout)连接超时10s
WithFastOpen(enable)启用快速打开优化false
WithUpstreamProxy(url)上游代理 URL
WithUpstreamAuth(user, pass)上游代理认证
WithLogger(logger)自定义 zerolog 记录器默认

令牌管理

go
// 正向代理令牌
token, err := server.AddForwardToken("custom_token")  // 或 "" 自动生成
if err != nil {
    log.Fatal(err)
}

// 反向代理令牌
opts := linksocks.DefaultReverseTokenOptions()
opts.Port = 9870
opts.Username = "user"
opts.Password = "pass"
opts.AllowManageConnector = false

result, err := server.AddReverseToken(opts)
if err != nil {
    log.Fatal(err)
}
log.Printf("令牌:%s,端口:%d", result.Token, result.Port)

// 连接者令牌(用于代理代理)
connectorToken, err := server.AddConnectorToken("connector_token", "reverse_token")
if err != nil {
    log.Fatal(err)
}

// 删除任何令牌
removed := server.RemoveToken("token_to_remove")

服务器生命周期

go
// 启动服务器并等待就绪
ctx := context.Background()
if err := server.WaitReady(ctx, 30*time.Second); err != nil {
    log.Fatal(err)
}

// 优雅关闭
server.Close()

服务器状态

go
// 检查客户端连接
clientCount := server.GetClientCount()
hasClients := server.HasClients()

// 检查特定令牌的客户端
tokenClients := server.GetTokenClientCount("specific_token")

客户端 API

创建客户端

go
// 默认客户端
client := linksocks.NewLinkSocksClient("token", linksocks.DefaultClientOption())

// 自定义配置
opt := linksocks.DefaultClientOption().
    WithWSURL("ws://localhost:8765").
    WithReverse(false).
    WithSocksPort(9870).
    WithReconnect(true).
    WithThreads(4)

client := linksocks.NewLinkSocksClient("token", opt)

客户端选项

方法描述默认值
WithWSURL(url)WebSocket 服务器 URL"ws://localhost:8765"
WithReverse(enable)启用反向代理模式false
WithSocksHost(host)SOCKS5 监听地址"127.0.0.1"
WithSocksPort(port)SOCKS5 监听端口9870
WithSocksUsername(user)SOCKS5 认证用户名
WithSocksPassword(pass)SOCKS5 认证密码
WithSocksWaitServer(wait)SOCKS 前等待服务器true
WithReconnect(enable)断开连接时自动重连false
WithReconnectDelay(delay)重连间的延迟5s
WithBufferSize(size)数据传输缓冲区大小32768
WithChannelTimeout(timeout)WebSocket 通道超时30s
WithConnectTimeout(timeout)连接超时10s
WithThreads(count)并发 WebSocket 连接1
WithFastOpen(enable)启用快速打开优化false
WithUpstreamProxy(url)上游代理 URL
WithUpstreamAuth(user, pass)上游代理认证
WithNoEnvProxy(disable)忽略代理环境变量false
WithLogger(logger)自定义 zerolog 记录器默认

客户端生命周期

go
// 启动客户端并等待就绪
ctx := context.Background()
if err := client.WaitReady(ctx, 30*time.Second); err != nil {
    log.Fatal(err)
}

// 检查连接状态
if client.IsConnected {
    log.Println("客户端已连接")
}

// 获取 SOCKS 端口(正向模式)
if port := client.SocksPort; port > 0 {
    log.Printf("SOCKS5 服务器在端口 %d", port)
}

// 优雅关闭
client.Close()

连接者管理(反向模式)

go
// 添加连接者(仅反向模式)
connectorToken, err := client.AddConnector("custom_connector")  // 或 "" 自动生成
if err != nil {
    log.Fatal(err)
}

// 删除连接者(仅反向模式)
err = client.RemoveConnector("connector_token")
if err != nil {
    log.Fatal(err)
}

// 获取伙伴计数
partnersCount := client.GetPartnersCount()

高级用法

自定义日志

go
import "github.com/rs/zerolog"

logger := zerolog.New(os.Stdout).With().
    Timestamp().
    Str("component", "linksocks").
    Logger()

// 带自定义记录器的服务器
serverOpt := linksocks.DefaultServerOption().WithLogger(logger)
server := linksocks.NewLinkSocksServer(serverOpt)

// 带自定义记录器的客户端
clientOpt := linksocks.DefaultClientOption().WithLogger(logger)
client := linksocks.NewLinkSocksClient("token", clientOpt)

上下文管理

go
// 创建可取消上下文
ctx, cancel := context.WithCancel(context.Background())
defer cancel()

// 使用超时
ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
defer cancel()

// 信号优雅关闭
c := make(chan os.Signal, 1)
signal.Notify(c, os.Interrupt, syscall.SIGTERM)
go func() {
    <-c
    log.Println("正在关闭...")
    cancel()
}()

// 使用上下文启动
if err := server.WaitReady(ctx, 0); err != nil {
    if err == context.Canceled {
        log.Println("请求关闭")
    } else {
        log.Fatal(err)
    }
}

错误处理

go
// 服务器错误处理
server := linksocks.NewLinkSocksServer(opt)

// 添加令牌并检查错误
if token, err := server.AddForwardToken(""); err != nil {
    log.Printf("添加令牌失败:%v", err)
} else {
    log.Printf("令牌已添加:%s", token)
}

// 客户端错误处理
client := linksocks.NewLinkSocksClient("token", opt)

// 带重试逻辑的连接
for attempts := 0; attempts < 3; attempts++ {
    ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
    err := client.WaitReady(ctx, 0)
    cancel()
    
    if err == nil {
        break // 成功
    }
    
    log.Printf("连接尝试 %d 失败:%v", attempts+1, err)
    if attempts < 2 {
        time.Sleep(5 * time.Second)
    }
}

性能调优

go
// 高吞吐量服务器
serverOpt := linksocks.DefaultServerOption().
    WithBufferSize(131072).      // 128KB 缓冲区
    WithFastOpen(true).          // 减少 RTT
    WithChannelTimeout(300*time.Second) // 长超时

// 高吞吐量客户端
clientOpt := linksocks.DefaultClientOption().
    WithBufferSize(131072).      // 128KB 缓冲区
    WithThreads(8).              // 多个连接
    WithFastOpen(true).          // 减少 RTT
    WithChannelTimeout(300*time.Second) // 长超时

// 低延迟配置
lowLatencyOpt := linksocks.DefaultClientOption().
    WithBufferSize(4096).        // 小缓冲区
    WithFastOpen(true).          // 立即响应
    WithConnectTimeout(2*time.Second) // 快速超时

基于 MIT 许可证发布。