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 许可证发布。