Ejemplo n.º 1
0
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]
}
Ejemplo n.º 2
0
/**
写入索引
**/
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
}
Ejemplo n.º 3
0
/**
写入任意数据,都使用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
}