UP MDTApi

This commit is contained in:
JiXieShi
2024-06-03 16:15:23 +08:00
parent 4b29709791
commit 352666f059
9 changed files with 214 additions and 70 deletions

View File

@@ -2,9 +2,7 @@ package utils
import (
"bytes"
"context"
"encoding/binary"
"encoding/hex"
"fmt"
"net"
"strconv"
@@ -87,43 +85,26 @@ func (r *InfoBuffer) get() byte {
return b
}
func connectServer(host string) (buf InfoBuffer, err error) {
func connectServer(host string) (buf InfoBuffer, ping int64, err error) {
socket, err := net.Dial("udp", host)
if err != nil {
return InfoBuffer{}, err
return InfoBuffer{}, -1, err
}
defer socket.Close()
sendData, _ := hex.DecodeString("FE01")
_, err = socket.Write(sendData)
if err != nil {
return InfoBuffer{}, err
}
ctx, cancel := context.WithTimeout(context.Background(), time.Second*2)
defer cancel()
workDone := make(chan struct{}, 1)
data := make([]byte, 2048)
go func() {
_, err = socket.Read(data)
workDone <- struct{}{}
}()
select {
case <-workDone:
buf.New(data)
case <-ctx.Done():
return InfoBuffer{}, fmt.Errorf("超时:%v", err)
}
return buf, nil
}
func ping(host string) (int64, error) {
startTime := time.Now()
conn, err := net.DialTimeout("tcp", host, time.Second*2)
_, err = socket.Write([]byte{0xFE, 0x01})
if err != nil {
return 0, err
return InfoBuffer{}, -1, err
}
conn.Close()
conn.RemoteAddr()
elapsedTime := time.Since(startTime).Milliseconds()
return elapsedTime, nil
data := make([]byte, 500)
socket.SetReadDeadline(time.Now().Add(2 * time.Second))
_, err = socket.Read(data)
if err != nil {
return InfoBuffer{}, -1, err
}
ping = time.Since(startTime).Milliseconds()
buf.New(data)
return buf, ping, nil
}
func GetServerInfo(host string) (ServerInfo, error) {
var info ServerInfo
@@ -140,17 +121,12 @@ func GetServerInfo(host string) (ServerInfo, error) {
info.Port = port
}
add := fmt.Sprintf("%s:%d", info.Host, info.Port)
d, err := ping(add)
if err != nil {
info.Status = "Offline"
return info, err
}
info.Ping = int(d)
buf, err := connectServer(add)
buf, ping, err := connectServer(add)
if err != nil {
info.Status = "Offline"
return info, err
}
info.Ping = int(ping)
info.Status = "Online"
info.Name = buf.readString()
info.Maps = buf.readString()