⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 packetq.cpp

📁 国内著名网络游戏dragon的服务端完整源码 内附完整数据库结构
💻 CPP
字号:
// PacketQ.cpp: implementation of the PacketQ class.
//
//////////////////////////////////////////////////////////////////////

#include "..\stdafx.h"
//#include "DRPointManger.h"
#include "PacketQ.h"


#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif


#include "../MyLog.h"

// 010309 KHS
int putpacketcount;


//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

//---------------------------------------------------------------------------
/*
 * The following functions are used for randomlize packets
 */
#define KEY 120751750

uint PacketQ::rotate(uint a,uint rn,int dir)
{
  uint b,sizeI;
  b=a;
  sizeI=8*sizeof(uint);
/*dir=-1 : left rotate,from lsb to msb*/
  if(dir==1) {
    a=a<<rn;
    b=b>>(sizeI-rn);
  }

/*others : right rotate,from msb to lsb*/
  else if(dir==0) {
    a=a>>rn;
    b=b<<(sizeI-rn);
  }
  return a=a|b;
}

void PacketQ::intToBuf(char *cp, int val)
{
    *cp++ = (char) (val & 0x000000ff);
    *cp++ = (char)((val & 0x0000ff00) >> 8);
    *cp++ = (char)((val & 0x00ff0000) >> 16);
    *cp++ = (char)((val & 0xff000000) >> 24);
}
//---------------------------------------------------------------------------

int PacketQ::bufToInt(unsigned char *cp)
{
    int val;

    val = *cp++;
    val += ((int) *cp++) << 8 ;
    val += ((int) *cp++) << 16;
    val += ((int) *cp++) << 24;
    return(val);
}

uint PacketQ::atrandom(uchar *src, uchar *resstr)
{
  uint sizeI,key,source;

  memcpy((void*)&source,src,sizeof(uint));
//  rn=time(NULL);
  sizeI=8*sizeof(uint);
  source=(~source&KEY)|(source&(~KEY));
  key=rotate(source,KEY%sizeI,1);
  memcpy(resstr,(void*)&key,sizeof(uint));
  resstr[sizeof(uint)]=0;
  return key;
}

uint PacketQ::derandom(uchar *src, uchar *resstr)
{
  uint a,sizeI,data,res;

  memcpy((void*)&data,src,sizeof(uint));
  sizeI=8*sizeof(uint);
  //printf("src=%s,key=%u,data=%u\n",src,key,data);
  a=rotate(data,KEY%sizeI,0);
  res =  (~a&(KEY))|(a&(~(KEY)));
  memcpy(resstr,(void*)&res,sizeof(uint));
  resstr[sizeof(uint)]=0;
  return res;
}
//---------------------------------------------------------------------------

PacketQ::PacketQ()
{
    query=NULL;
}

PacketQ::~PacketQ()
{
    clear();
}

void PacketQ::clear() {
    Query *tempque;

    tempque=query;
    while (tempque!=NULL){
      query=query->next;
      free (tempque);
      tempque=query;
    }
    query=tempque=NULL;
}

int PacketQ::put(char *buf, int len, bool encode)
{
  Query *newque,*tempque;
  unsigned char  code[MAX_PACKET_LEN+1];
  int i;

  //DebugPrintf("alloc queue!");
  newque = (Query *)malloc(sizeof(Query));
  if (newque==NULL)
    return 0;
  //DebugPrintf("en(de)code (%s)",buf);
  if (encode){
    int morespaces;

    memcpy(code,buf+1,len-1);
    morespaces=4-(len-1)%4; /* Ι奔'-'

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -