1
0
mirror of https://github.com/IceWhaleTech/CasaOS.git synced 2025-07-06 23:37:26 +02:00
Files
CasaOS/service/udpconn.go

137 lines
3.1 KiB
Go
Raw Normal View History

package service
import (
2022-03-10 16:25:33 +08:00
"context"
"crypto/md5"
"crypto/tls"
"encoding/hex"
"encoding/json"
"fmt"
"io"
"io/ioutil"
"net"
"strconv"
"time"
"github.com/IceWhaleTech/CasaOS/model"
"github.com/IceWhaleTech/CasaOS/pkg/config"
"github.com/IceWhaleTech/CasaOS/pkg/utils/file"
"github.com/lucas-clemente/quic-go"
uuid "github.com/satori/go.uuid"
)
var UDPconn *net.UDPConn
var PeopleMap map[string]quic.Stream
2022-03-10 16:25:33 +08:00
var Message chan model.MessageModel
func Dial(addr string, msg model.MessageModel) (m model.MessageModel, err error) {
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
defer cancel()
2022-03-10 16:25:33 +08:00
Message = make(chan model.MessageModel)
quicConfig := &quic.Config{
ConnectionIDLength: 4,
KeepAlive: true,
}
tlsConf := &tls.Config{
InsecureSkipVerify: true,
NextProtos: []string{"bench"},
SessionTicketsDisabled: true,
}
session, err := quic.DialAddrContext(ctx, addr, tlsConf, quicConfig)
if err != nil {
return m, err
}
stream, err := session.OpenStreamSync(ctx)
2022-03-10 16:25:33 +08:00
if err != nil {
session.CloseWithError(1, err.Error())
return m, err
2022-03-10 16:25:33 +08:00
}
SayHello(stream, msg.To)
SendData(stream, msg)
2022-03-10 16:25:33 +08:00
go ReadContent(stream)
result := <-Message
stream.Close()
return result, nil
}
func SayHello(stream quic.Stream, to string) {
msg := model.MessageModel{}
msg.Type = "hello"
msg.Data = "hello"
msg.To = to
msg.From = config.ServerInfo.Token
msg.UUId = uuid.NewV4().String()
SendData(stream, msg)
}
var pathsss string
//发送数据
func SendData(stream quic.Stream, m model.MessageModel) {
b, _ := json.Marshal(m)
prefixLength := file.PrefixLength(len(b))
data := append(prefixLength, b...)
stream.Write(data)
}
//读取数据
2022-03-10 16:25:33 +08:00
func ReadContent(stream quic.Stream) {
path := ""
for {
prefixByte := make([]byte, 4)
c1, err := io.ReadFull(stream, prefixByte)
fmt.Println(c1, err, string(prefixByte))
prefixLength, err := strconv.Atoi(string(prefixByte))
messageByte := make([]byte, prefixLength)
t, err := io.ReadFull(stream, messageByte)
fmt.Println(t, err, string(messageByte))
m := model.MessageModel{}
err = json.Unmarshal(messageByte, &m)
if err != nil {
fmt.Println(err)
}
//传输数据需要继续读取
if m.Type == "file_data" {
dataModelByte, _ := json.Marshal(m.Data)
dataModel := model.TranFileModel{}
err := json.Unmarshal(dataModelByte, &dataModel)
fmt.Println(err)
dataLengthByte := make([]byte, 8)
t, err = io.ReadFull(stream, dataLengthByte)
dataLength, err := strconv.Atoi(string(dataLengthByte))
if err != nil {
fmt.Println(err)
}
dataByte := make([]byte, dataLength)
t, err = io.ReadFull(stream, dataByte)
if err != nil {
fmt.Println(err)
}
sum := md5.Sum(dataByte)
hash := hex.EncodeToString(sum[:])
if dataModel.Hash != hash {
fmt.Println("hash不匹配", hash, dataModel.Hash)
}
filepath := path + strconv.Itoa(dataModel.Index)
err = ioutil.WriteFile(filepath, dataByte, 0644)
if dataModel.Index >= (dataModel.Length - 1) {
2022-03-09 19:44:08 +08:00
//file.SpliceFiles("", path, dataModel.Length)
break
}
} else {
2022-03-10 16:25:33 +08:00
Message <- m
}
}
2022-03-10 16:25:33 +08:00
Message <- model.MessageModel{}
}