socket协议-根据结构体写包,接收

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

时间: 2024-10-07 19:28:01

socket协议-根据结构体写包,接收的相关文章

java socket传送一个结构体给用C++编写的服务器解析的问题

另一端是Java写客户端程序,两者之间需要通信.c++/c接收和发送的都是结构体,而Java是直接发送的字节流或者byte 数组. 解决方法:c++/c socket 在发送结构体的时候其实发送的也是字节流.因为结构体本身也是内存中的一块连续数据.问题就变成了如何把结构体手动转成字节的问题了采用类似的报头: // packet head typedef struct tagPacketHead{ long PacketID; long PacketLen;} PacketHead;此时套接口的读

socket编程——sockaddr_in结构体操作

sockaddr结构体 sockaddr的缺陷: struct sockaddr 是一个通用地址结构,这是为了统一地址结构的表示方法,统一接口函数,使不同的地址结构可以被bind() , connect() 等函数调用:sa_data把目标地址和端口信息混在一起了 struct sockaddr {       unsigned short sa_family; char sa_data[14];                   };  sa_family是通信类型,最常用的值是 "AF_I

C语言用结构体写一个通讯录

今天写了个通讯录,给大家看一下 #define _CRT_SECURE_NO_WARNINGS 1 #include <stdio.h> #include <stdlib.h> #include <string.h> extern meau();//目录函数就没写出来了,大家可以自己写一下 typedef struct T//定义一个结构体 { char name[10]; char sex[4]; int age; char tetl[13]; char add[20

结构体写通讯录

<pre name="code" class="cpp">#ifndef _CONTACT_H_//宏定义通讯录 #define _CONTACT_H_ //宏定义通讯录 #define NAME_LEN 30//全局变量 #define SEX_LEN 5//全局变量 #define TELP_LEN 12//全局变量 #define GRO_LEN 15//全局变量 #define MAX_PER 1000//全局变量 typedef struct

网络协议报文结构与抓包示例

TCP/IP的分层 OSI的分层 以太网帧抓包看到的结构如下图: IP数据报文 以太网帧抓包看到的结构如下图: TCP数据报文 TCP报文抓包看到的结构如下图: UDP数据报文 UDP报文抓包看到的结构如下图:

TCP/IP协议头部结构体

http://blog.csdn.net/ithomer/article/details/5662383 IP和TCP都20字节,IP存放地址,TCP存放端口.TCP还存放一些用于TCP特定协议的内容,序列号.确认号 // i386 is little_endian. #ifndef LITTLE_ENDIAN #define LITTLE_ENDIAN (1) //BYTE ORDER #else #error Redefine LITTLE_ORDER #endif //Mac头部,总长度1

struct socket结构体详解

在内核中为什么要有struct socket结构体呢?    struct socket结构体的作用是什么?    下面这个图,我觉得可以回答以上两个问题.      由这个图可知,内核中的进程可以通过使用struct socket结构体来访问linux内核中的网络系统中的传输层.网络层.数据链路层.也可以说struct socket是内核中的进程与内核中的网路系统的桥梁.   struct socket {      socket_state  state; // socket state  

[go]结构体和json转换

细说Golang的JSON解析 golang JSON技巧 Go - 如何解析 JSON 数据?mapstruct包 读写结构体 //写[obj,] type user struct { Name string `json:"name"` Age int `json:"age"` } m:= []user{ {"m1",1}, {"m2",2}, } f, _ := os.Create("./data.txt&quo

Go的结构体

Go的结构体 结构体 Go语言提供了一种自定义数据类型,可以封装多个基本数据类型,这种数据类型叫结构体,英文名称struct 结构体的定义 type 类型名 struct { 字段名 字段类型 字段名 字段类型 - } 类型名:自定义结构体的名称,在同一个包内不能重复 字段名:结构体中的字段名必须惟一 字段类型:表示结构体字段的具体类型 例子一 type persion struct { name string city string age int8 } 结构体实例化 只有当结构体实例化时,才