func (p *Packet) genHeader() []byte { header := make([]byte, 96) dataLenBytes := utils.Int16ToBytes(len(p.RawData) - 96) copy(header[Length_INDEX:Length_END], dataLenBytes) tunnelIdBytes := utils.Uint64ToBytes(p.TunnelId) copy(header[TunnelId_INDEX:TunnelId_END], tunnelIdBytes) sessionIdBytes := utils.Uint32ToBytes(p.SessionId) copy(header[SessionId_INDEX:SessionId_END], sessionIdBytes) packetIdBytes := utils.Uint32ToBytes(p.Id) copy(header[Id_INDEX:Id_END], packetIdBytes) // 传输层协议类型 header[ProtoType_INDEX] = p.ProtoType // 包类型 header[PacketType_INDEX] = p.PacketType // other 长度 header[OtherLen_INDEX] = byte(p.OtherLen) count := OtherLen_INDEX + 1 if p.OtherLen != 0 && p.OtherLen == len(p.Dst) { dstBytes := []byte(p.Dst) copy(header[OtherLen_INDEX+1:OtherLen_INDEX+1+p.OtherLen], dstBytes) count += len(dstBytes) } else { //p.LOG.Println("error udppacket genHeader OtherLen not match len(Dst)") header[OtherLen_INDEX] = byte(0) } return header[:count] }
/** 写入索引 **/ func AddIndex(dataAddr Entity.TaskAddr) (int, error) { //得到存储方式的句柄 fd := IndexStore.GetFd().(*os.File) //得到文件状态 fileStat, err := fd.Stat() if err != nil { return 0, Utils.LogErr(err) } // //得到文件大小,这个位置就是这条记录的起始位置 dataAddr.FileAddr = fileStat.Size() dataAddr.EleAddr = nil gob.Register(dataAddr) //得到gob转换出来的[]byte var wbuf bytes.Buffer egob := gob.NewEncoder(&wbuf) Utils.LogInfo("gob index=%#v\n", dataAddr) err = egob.Encode(dataAddr) if err != nil { Utils.LogInfo("index gob err") return 0, Utils.LogErr(err) } //拼出最终存入文件的数据==数据长度+数据体 var storeByte []byte storeByteBuf := bytes.NewBuffer(storeByte) //写入数据长度 _, err = storeByteBuf.Write(Utils.Uint32ToBytes(uint32(wbuf.Len()))) if err != nil { return 0, Utils.LogErr(err) } _, err = storeByteBuf.Write(wbuf.Bytes()) if err != nil { return 0, Utils.LogErr(err) } wData := storeByteBuf.Bytes() Utils.LogInfo("len=%d\n", storeByteBuf.Len()) Utils.LogInfo("data=%#v\n", wData) writeNum, err := IndexStore.Set(wData) if err != nil { return 0, Utils.LogErr(err) } return writeNum, nil }
/** 写入任意数据,都使用gob存入file,返回的int64,是该数据在文件中的起始位置 **/ func AddData(data Entity.TaskData) (int, error) { //得到存储方式的句柄 fd := DataStore.GetFd().(*os.File) //得到文件状态 fileStat, err := fd.Stat() if err != nil { return 0, Utils.LogErr(err) } data.FileAddr = fileStat.Size() //得到gob转换出来的[]byte var wbuf bytes.Buffer egob := gob.NewEncoder(&wbuf) Utils.LogInfo("gob data=%#v\n", data) err = egob.Encode(data) if err != nil { Utils.LogInfo("data gob err") return 0, Utils.LogErr(err) } //拼出最终存入文件的数据==数据长度+数据体 var storeByte []byte storeByteBuf := bytes.NewBuffer(storeByte) //写入数据长度 _, err = storeByteBuf.Write(Utils.Uint32ToBytes(uint32(wbuf.Len()))) if err != nil { return 0, Utils.LogErr(err) } _, err = storeByteBuf.Write(wbuf.Bytes()) if err != nil { return 0, Utils.LogErr(err) } wData := storeByteBuf.Bytes() Utils.LogInfo("len=%d\n", storeByteBuf.Len()) Utils.LogInfo("data=%#v\n", wData) writeNum, err := DataStore.Set(wData) if err != nil { return 0, Utils.LogErr(err) } return writeNum, nil }