package com import ( "bytes" "encoding/json" "fmt" "log" "math/rand" "os" ) const ( baseStr = "qwertyuioplkjhgfdsazxcvbnm-0123456789.ZXCVBNMLKJHGFDSAQWERTYUIOP" baseStrLen = len(baseStr) sockSplitStr = "==" sockEndStr = "==END==" sockStartStr = "==EVENT:" BuffSize = 1024 SockEndLen = len(sockEndStr) SockStartLen = len(sockStartStr) SockSplitLen = len(sockSplitStr) ) var ( SockEndBytes = []byte(sockEndStr) SockStartBytes = []byte(sockStartStr) SockSplitBytes = []byte(sockSplitStr) ) type Packet struct { Event string Data []byte } type ClientConfig struct { Protocol string `json:"protocol"` Address string `json:"address"` Port int `json:"port"` Positive bool `json:"positive"` Frequency int `json:"frequency"` } type ServerConfig struct { Protocol string `json:"protocol"` Port int `json:"port"` Gap int `json:"gap"` Len int `json:"length"` } func RandBytesWithHeader() []byte { buffer, size := bytes.Buffer{}, rand.Intn(20)+30 header := fmt.Sprintf("(%d):", size) buffer.WriteString(header) buffer.Write(RandBytes(size - len(header))) return buffer.Bytes() } func RandBytes(size int) []byte { res := make([]byte, size) for i := range res { res[i] = baseStr[rand.Intn(baseStrLen)] } return res } func UintToBytes(num uint) []byte { res := make([]byte, 4) res[0], res[1] = byte(num>>24), byte((num&0x00ff0000)>>16) res[2], res[3] = byte((num&0x0000ff00)>>8), byte(num&0x000000ff) return res } func BytesToUint(from []byte) uint { return uint(from[0])<<24 + uint(from[1])<<16 + uint(from[2])<<8 + uint(from[3]) } func IntToBytes(num uint) []byte { res := make([]byte, 4) res[0], res[1] = byte(num>>24), byte((num&0x00ff0000)>>16) res[2], res[3] = byte((num&0x0000ff00)>>8), byte(num&0x000000ff) return res } func BytesToInt(from []byte) int { return int(from[0])<<24 + int(from[1])<<16 + int(from[2])<<8 + int(from[3]) } func ReadClientConfig(filepath string, logger *log.Logger) ClientConfig { defaultConfig := ClientConfig{ Protocol: "tcp", Address: "192.168.1.6:3060", Port: 3080, Positive: false, Frequency: 1, } file, err := os.Open(filepath) if err != nil { logger.Print("File open error:", err) return defaultConfig } defer func() { err = file.Close() if err != nil { logger.Print("Fail to close config file:", err) } }() decoder := json.NewDecoder(file) var config ClientConfig err = decoder.Decode(&config) if err != nil { logger.Print("Json decode error:", err) return defaultConfig } return config } func ReadServerConfig(filepath string, logger *log.Logger) ServerConfig { defaultConfig := ServerConfig{ Protocol: "tcp", Port: 3060, Gap: 30, Len: 30, } file, err := os.Open(filepath) if err != nil { logger.Print("File open error:", err) return defaultConfig } defer func() { err = file.Close() if err != nil { logger.Print("Fail to close ServerConfig file:", err) } }() decoder := json.NewDecoder(file) var config ServerConfig err = decoder.Decode(&config) if err != nil { logger.Print("Json decode error:", err) return defaultConfig } return config }