废话不多说,直接看代码:
1、了解客戶端和服務器端通訊的協議
比如一下是某產品的登陸協議包:
typedef struct PK_LOGIN_SRC{
PK_HEADER pk_head;
char name[16];
char sig[32];
int ver;
unsigned char type;
unsigned char need_init;
char tm[9];
}PK_LOGIN_SRC;
2、组装协议包数据
PK_LOGIN_SRC *login;
//开辟内存
login=(PK_LOGIN_SRC *)malloc(sizeof(PK_LOGIN_SRC));
login->pk_head.cmd=htonl(CMD_LOGIN_SRC);
login->pk_head.size=htonl(sizeof(PK_LOGIN_SRC));
login->pk_head.seq=htonl(0);
memset(login->name,0,16);//网络字節,空字符串用0表示
memset(login->sig,0,32);
login->ver=0;
login->type=2,
login->need_init=0;
memset(login->tm,0,9);
//初始化设置加载dll和发送和结束等超时时间
lr_load_dll("getGETSPriceDLL.dll");
lr_load_dll("GET2.0.dll");
lrs_set_recv_timeout(5,0);
lrs_set_recv_timeout2(5,0);
lrs_set_send_timeout(10,0);
lrs_set_connect_timeout(
360,120);
//创建连接
lrs_create_socket(socket_desc, "TCP", "LocalHost=0", "RemoteHost=127.0.0.1:6001", LrsLastArg);
lrs_save_param_ex(socket_desc,"user",(char*)login,0,sizeof(PK_LOGIN_SRC),"ebcdic","param_l");
lrs_send(socket_desc, "buf0", LrsLastArg);
4、解析接受到的数据包,进行分析
//设置每次接收数据包的方式为:读取直到缓冲结束。
lrs_set_receive_option(EndMarker,EndMarker_None);
//不断的接受数据包进行解析判断
while(flag>0){
lrs_receive(socket_desc, "buf1", LrsLastArg);
lrs_get_last_received_buffer(socket_desc,&iBuff,&len);
DealBuff(iBuff,len);
//flag--;
}
//解析数据
void DealBuff(char *buff,int RecvLen){
int buffLen = RecvLen;
int iProcLen = 0;
int headLen=sizeof(PK_HEADER);
//head=(PK_HEADER *)buff;
PK_TRADEDATA *tradedata;
//lr_message("@@@@@@@@@@@@@@@@@@@@@@@@");
while(buffLen>headLen)
{
head=(GETS_PK_HEADER *)buff;
//lr_message("---------------------------");
switch(
htonl(head->cmd)){
//如果是登录回包
case CMD_LOGIN_SRC_R:
lr_message("登錄成功");
break;
//如果是数据回包
case CMD_TRADE_DATA:
tradedata=(PK_TRADEDATA *)buff;
lr_message("%s,%s,%I64d,%f,%f",tradedata->no,htons(tradedata->price.price_feed),hton64i(tradedata->check_time),htonf(tradedata->price_buy),htonf(tradedata->price_sell));
break;
}
iProcLen = htonl(head->size);
buffLen = buffLen - iProcLen;
//指针往下移,继续解析后面的数据
buff += iProcLen;
}
}
5、常用的字节转化方法:
//C++里面整型64位
typedef struct __BIG_INT
{
unsigned long lowpart;
long highpart;
}BIG_INT;
typedef BIG_INT __int64
//长整型网络字节高地位转化
long htonl(long tmp)
{
WORD st[2],td;
*(int*)(st)=tmp;
td=st[1];
st[1]=st[0]<<8|st[0]>>8;
st[0]=td<<8|td>>8;
return *(int*)st;
}
//字符网络字节转化
{
return tmp<<8|tmp>>8;
}
static char g_bNeedConvertByteOrder_hton = 0;
//浮点型网络字节转化
{
double dbRet;
int * pSrc = (int*)&db;
int * pDes=(int*)&dbRet;
if(!g_bNeedConvertByteOrder_hton)
{
if(htons(0x0102)==0x0102)
g_bNeedConvertByteOrder_hton = -1;
else g_bNeedConvertByteOrder_hton = 1;
}
if(g_bNeedConvertByteOrder_hton==-1)
return db;
pSrc = (int*)&db;
pDes=(int*)&dbRet;
pDes[0] = htonl(pSrc[1]);
pDes[1] = htonl(pSrc[0]);
return dbRet;
}
typedef unsigned int t_uint32;
//64位整型转化
__int64 hton64i(__int64 i)
{
__int64 iRet;
long * pSrc = (long*)&i;
long * pDes=(long*)&iRet;
if(!g_bNeedConvertByteOrder_hton)
{
if(htons(0x0102)==0x0102)
g_bNeedConvertByteOrder_hton = -1;
else g_bNeedConvertByteOrder_hton = 1;
}
if(g_bNeedConvertByteOrder_hton==-1)
return i;
pDes[0] = htonl(pSrc[1]);
pDes[1] = htonl(pSrc[0]);
return iRet;
}