博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
socket协议-根据结构体写包,接收
阅读量:6803 次
发布时间:2019-06-26

本文共 4274 字,大约阅读时间需要 14 分钟。

init:

#include "lrs.h"

#define PROTOVER 351

enum RET_ERROR
{
SUCCESS=0,
ERROR,
WHILE
};
enum errorCode
{
ERROR_NULL=0,
ERROR_NO_SIZE,
ERROR_BUFFER_POINT,
ERROR_POINT,
ERROR_ALLOC_MEM,
ERROR_WRITE_OVERFLOW,
ERROR_READ_OVERFLOW,
ERROR_NO_MOVE,
ERROR_ADDRESS_OVERFLOW,
ERROR_PREPLACE_POINT,
ERROR_OT_OVERFLOW,
ERROR_OVERFLOW,
ERROR_PACKETSIZE_OVERFLOW,
ERROR_NO_FOUND,
ERROR_NO_COUNT,
};
typedef struct PackageHead
{
DWORD iProtoVer;
DWORD iPackageType;
}Head;
//功能函数
typedef struct _StreamWRBuffer
{
char* cBuf;
unsigned int iBufSize;
unsigned int iWPos;
unsigned int iRPos;
}SWRBUFFER,*PSWRBUFFER;
typedef struct ConnectPackageData
{
DWORD iConnectionID;//连接请求时为0,返回一个连接号,由服务器管理
DWORD ClientTaskID;//客户端任务编号
char RobotName[64];
char RobotPWD[64];
}Connect;

typedef struct SectionRequestPackageData

{
DWORD iConnectionID;
DWORD ClientTaskID;//客户端任务编号
DWORD iSectionID;//0,返回一个会话ID,由服务器管理
char UserIDX[64];
char UserMAC[64];
char RoomID[64];
}SRP;

typedef struct QAPackageData
{
DWORD iConnectionID;//每个机器人分配一个id,标记该机器人帐号的一个连接,机器人与平台对应
DWORD ClientInquireID;//当同一台客户机运行多个客户动态库的时候标记每个查询的ID
DWORD QuestionID;
DWORD iSectionID;
DWORD iInquireType;//查询包类型
}QD;

typedef struct DisconnectPackageData
{
DWORD iConnectionID;//连接请求时为0,返回一个连接号,由服务器管理
DWORD ClientTaskID;//客户端任务编号
}DP;

typedef struct SectionEndPackageData
{
DWORD iConnectionID;
DWORD iSectionID;//非0连接ID
DWORD iClientTaskID;
}SEP;

//创建socket

void Create_socket()
{
int ret=0;
int errorcount=0;
while(1)
{
ret=lrs_create_socket("socket0", "TCP","RemoteHost=192.168.0.53:10010", LrsLastArg);
if(ret)
{
switch(ret)
{
case LRS_CREATE_SOCK_FAILED:
case LRS_RECV_MISMATCH:
errorcount++;
if(errorcount>3){
lr_error_message("创建失败, 返回错误码为:%d",ret);
lr_abort ();
return;
}
continue;
default:
lr_error_message("创建socket失败,错误码=%d",ret);
lr_abort ();
return;
}
}
break;
}//end while
}
/*
//字符串写入有长度的
DWORD writeToBufferStringL(PSWRBUFFER buffer,char*str,unsigned int ssize)
{
if(!buffer||!(buffer->cBuf))
{
return ERROR_POINT;
}
if((buffer->iWPos+ssize)>=(buffer->iBufSize))
{
return ERROR_WRITE_OVERFLOW;
}
memcpy(buffer->cBuf+buffer->iWPos,str,ssize);
buffer->iWPos+=ssize;
return ERROR_NULL;
}
*/
//接收
DWORD RecvBuf(char* cRecvBuf,char* cSocketName,char* cBufName)
{
int ret=0;
char * cRecvdata=0;
int iRecvdatalen=0;
DWORD begin=0,cur=0;
begin=clock();
while(1)
{
ret=lrs_receive(cSocketName,cBufName,LrsLastArg);
switch(ret)
{
case 0:
case LRS_RECV_MISMATCH :
ret=lrs_get_last_received_buffer(cSocketName,&cRecvdata,&iRecvdatalen);
if(ret)
{
lr_error_message("last_recv获取接收缓冲区出错,错误码:%d",ret);
lrs_free_buffer(cRecvdata);
return ERROR;
}
if(iRecvdatalen)
{
memcpy(cRecvBuf,cRecvdata,iRecvdatalen);
lrs_free_buffer(cRecvdata);
return SUCCESS;
}
cur=clock();
if((cur-begin)>=10000)
{
lr_error_message ("接收超时,接收等待时间=%d毫秒",cur-begin);
return ERROR;
}
continue;
default:
lr_error_message ("recv接收数据出错,错误码:%d",ret);
return ERROR;
}//end switch
}//end while
return SUCCESS;
}

Head * pHead=0;

Connect * pConnect=0;
char cSendBuf[4096];
char cRecvBuf[4096];

//PSWRBUFFER recvBuf=0;

vuser_init()
{
int ret=0;
lrs_set_recv_timeout(100,0);
lrs_set_recv_timeout2(0,10);
lrs_startup(257);
//创建socket
Create_socket();

return 0;

}

 

action:

#include "lrs.h"

Action()
{
//封包
int ret=0;
pHead=(Head *)cSendBuf;
pHead->iProtoVer=PROTOVER;
pHead->iPackageType=12;

pConnect=(Connect *)(cSendBuf+sizeof(Head));

//pConnect->iConnectionID=;
//pConnect->ClientTaskID=;
sprintf(pConnect->RobotName,"paopaoba");
sprintf(pConnect->RobotPWD,"paopaoba");
ret=lrs_save_param_ex("socket0","user",cSendBuf,0,sizeof(Head)+sizeof(Connect),"ebcdic","Connect");
lr_start_transaction("send");

ret=lrs_send("socket0","buf1",LrsLastArg);

if(ret)
{
lr_error_message("send ERROR!ret=%d",ret);

}

lr_end_transaction("send", LR_AUTO);

lr_error_message("send succes");

//lrs_receive("socket0","buf10",LrsLastArg);
//lr_error_message("get return %s",buf10);
//char* recbuf;
ret=RecvBuf(cRecvBuf,"socket0","buf10");
lr_error_message("get string :%s",cRecvBuf);
pHead=(Head *)cRecvBuf;
lr_error_message("get string :%d",pHead->iPackageType);
//解析cRecvBuf
pConnect=(Connect *)(cSendBuf+sizeof(Head));
lr_error_message("get string :%s",pConnect->RobotPWD);
return 0;
}

 data:

;WSRData 2 1

send buf1 "<Connect>"

recv buf10 12

 

-1

转载于:https://www.cnblogs.com/tester-huang/p/4632436.html

你可能感兴趣的文章
MYSQL——数据修改
查看>>
中国的网站能活几天?
查看>>
PHP中发送邮件的几种方法总结
查看>>
vmware中修改虚拟机MAC地址的方法!
查看>>
RHCS集群 切换时defunct僵尸进程解决方案
查看>>
IOS:类方法(静态方法)和实例方法
查看>>
Zabbix监控CPU与实际值不符合,
查看>>
exchange2003系列总结:-5邮件加密与签名的工作流程
查看>>
Know Difference between Oracle Reserved Words and Keywords
查看>>
iOS-APP提交上架流程(新手必看!2016年3月1日最新版)
查看>>
***linux下mysql的root密码忘记解决方法
查看>>
AS3 属性绑定
查看>>
WindowsXP、Windows2003本地密码清除方法
查看>>
keepalived高可用LVS与Nginx
查看>>
Hadoop 2.x生态系统中常用框架
查看>>
如何得到当前程序执行的堆栈
查看>>
RedHat 7配置KVM和桥接
查看>>
算法设计与分析复习——第四章:贪心算法
查看>>
OpenStack HA集群1-Galera Cluster for Mysql
查看>>
ssh 遍历IPS 进行连接
查看>>