81 lines
1.8 KiB
Go
81 lines
1.8 KiB
Go
|
|
package main
|
|||
|
|
|
|||
|
|
import (
|
|||
|
|
"io"
|
|||
|
|
"log"
|
|||
|
|
"net"
|
|||
|
|
"os"
|
|||
|
|
"strings"
|
|||
|
|
|
|||
|
|
"gopkg.in/ini.v1"
|
|||
|
|
)
|
|||
|
|
|
|||
|
|
func readConfig() (string, string) {
|
|||
|
|
cfg, err := ini.Load("config.conf")
|
|||
|
|
if err != nil {
|
|||
|
|
log.Fatalf("无法读取配置文件: %v", err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
section := cfg.Section("url")
|
|||
|
|
|
|||
|
|
minerPort := strings.Trim(section.Key("in").String(), `""`)
|
|||
|
|
minerPoolAddr := strings.Trim(section.Key("out").String(), `""`)
|
|||
|
|
|
|||
|
|
return minerPort, minerPoolAddr
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
var minerPort, minerPoolAddr = readConfig()
|
|||
|
|
|
|||
|
|
// 处理矿机请求的函数
|
|||
|
|
func handleMinerConnection(minerConn net.Conn) {
|
|||
|
|
defer minerConn.Close()
|
|||
|
|
log.Println("有矿机接入")
|
|||
|
|
// 连接到矿池
|
|||
|
|
poolConn, err := net.Dial("tcp", minerPoolAddr)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Printf("无法连接到矿池: %v", err)
|
|||
|
|
return
|
|||
|
|
}
|
|||
|
|
defer poolConn.Close()
|
|||
|
|
|
|||
|
|
// 启动两个 goroutine:一个从矿机接收数据并转发到矿池,另一个从矿池接收数据并转发回矿机
|
|||
|
|
go transferData(minerConn, poolConn)
|
|||
|
|
go transferData(poolConn, minerConn)
|
|||
|
|
|
|||
|
|
// 保持服务运行,直到矿机或矿池关闭连接
|
|||
|
|
select {}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 数据转发函数:从源连接读取数据并写入到目标连接
|
|||
|
|
func transferData(src net.Conn, dest net.Conn) {
|
|||
|
|
_, err := io.Copy(dest, src)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Printf("数据转发失败: %v", err)
|
|||
|
|
}
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
func main() {
|
|||
|
|
// 设置代理服务监听端口
|
|||
|
|
listener, err := net.Listen("tcp", minerPort)
|
|||
|
|
if err != nil {
|
|||
|
|
log.Fatalf("无法启动监听服务: %v", err)
|
|||
|
|
os.Exit(1)
|
|||
|
|
}
|
|||
|
|
defer listener.Close()
|
|||
|
|
|
|||
|
|
log.Printf("代理服务启动,监听端口 %s\n", minerPort)
|
|||
|
|
|
|||
|
|
// 不断接收来自矿机的连接
|
|||
|
|
for {
|
|||
|
|
// 接受矿机连接
|
|||
|
|
minerConn, err := listener.Accept()
|
|||
|
|
if err != nil {
|
|||
|
|
log.Printf("接受连接失败: %v", err)
|
|||
|
|
continue
|
|||
|
|
}
|
|||
|
|
|
|||
|
|
// 为每个矿机连接启动一个新的 goroutine 来处理
|
|||
|
|
go handleMinerConnection(minerConn)
|
|||
|
|
}
|
|||
|
|
}
|