通用打包和解包(Socket) 抛砖引你的玉

qekocom 2009-03-10 03:15:42
Socket编程很简单,但网上质量高的代码并不多见,因为一个好的通信程序,要有很多相关的技能,例如报文的解析,打包和解包,多线程并发,通信同步控制等。我这里只有一个砖(.h)的文件,希望高手能编写玉(.cpp)拿出来给大家学习。

#ifndef __MS_PACKET_H__
#define __MS_PACKET_H__

#define PACKET_API //__declspec(dllexport)

#include <afxsock.h> // MFC socket extensions

#pragma warning(disable: 4251) //export dll safely warning
#pragma warning(disable: 4786) //stl debug warning

//Packet Item Data Type
#define PIT_BINARY USHORT(0) //二进制类型,字符串也用这个类型标识
#define PIT_ULONG USHORT(1) //无符号长整型
#define PIT_INT USHORT(2) //有符号整型
#define PIT_FLOAT USHORT(3) //浮点数类型

#ifndef RC_OK
#define RC_OK 0
#endif

#ifndef RC_FAILED
#define RC_FAILED -1
#endif

#include <string>
#include <map>
#include <set>
#include <list>
#include <time.h>

using namespace std;

//SOCKET TYPE
#define SKT_TCP UCHAR(0) //TCP
#define SKT_UDP UCHAR(1) //UDP, 都没有返回, 短连接

//RESPONSE TYPE, only SKT_TCP
#define RPT_UNRESPONSE UCHAR(0) //没有回应
#define RPT_RESPONSE UCHAR(1) //有回应

//LINK TYPE, only SKT_TCP
#define LKT_SHORT UCHAR(0) //短连接
#define LKT_LONG UCHAR(1) //长连接





//删除部分是监控程序用到的,已经重新定义过了
/*
#define CMD_WM_GET 0x00000101 //WarningMonitor向模块取信息
#define CMD_WM_GET_RESP 0x80000102 //模块向WarningMonitor回信息
#define CMD_WM_SYS_MSG 0x00000103 //模块主动向WarningMonitor报告信息
#define CMD_WM_FAILED_DATA 0x00000104 //模块主动向WarningMonitor 报告丢失数
*/

//Item ID
#define ITEM_SRC_MODULEID 0x0001 //UINT 源模块标识
#define ITEM_DST_MODULEID 0x0002 //UINT 目标模块标识
#define ITEM_TRANSACTIONID 0x0003 //STRING 事务标识
#define ITEM_MSGID 0x0004 //BINARY(8) CMPP 定义的MSGID
#define ITEM_ORIGIN_SERVICECODE 0x0005 //STRING(Max21) 接入号



//以下是监控程序用到的宏
#define CMD_WM_GET_STATUS 0x00000101 //WarningMonitor向模块取状态信息
#define CMD_WM_GET_STATUS_RESP 0x80000101 //模块向WarningMonitor返回状态信息

#define CMD_WM_GET_LIST 0x00000102 //WarningMonitor向模块取队列状态信息
#define CMD_WM_GET_LIST_RESP 0x80000102 //模块向WarningMonitor返回队列状态信息

#define CMD_WM_GET_FLOW 0x00000103 //WarningMonitor向模块取流量信息
#define CMD_WM_GET_FLOW_RESP 0x80000103 //模块向WarningMonitor返回流量信息

#define CMD_WM_SYS_MSG 0x00000104 //模块主动向WarningMonitor报告状态信息
#define CMD_WM_FAILED_DATA 0x00000105 //模块主动向WarningMonitor 报告丢失数
#define CMD_WM_APP_STATUS 0x00000106 //报告业务程序状态

#define ITEM_WM_LEVEL 0x0101 //UINT 模块的告警序号,监控模块可根据些值判断是否重启
#define ITEM_WM_MSG 0x0102 //STRING Max500 报告系统日志
#define ITEM_WM_FAILED 0x0103 //BINARY Max3000 报告丢弃内容


//发送接收队列状态
#define ITEM_WM_LIST_ACCEPT 0x0121 //UINT 接收队列总条数
#define ITEM_WM_LIST_SEND 0x0122 //UINT 发送队列总条数
#define ITEM_WM_SLOW_SEND 0x0123 //UINT 低优先级发送队列条数
#define ITEM_WM_NORMAL_SEND 0x0124 //UINT 正常发送队列条数
#define ITEM_WM_FAST_SEND 0x0125 //UINT 高优先级发送队列条数

//end of 监控程序用到的宏


#define MAX_THREAD_COUNT 256

#define ERR_RECV_FAILED -101
#define ERR_SETBODY_FAILED -102
#define ERR_FAILED_RETRY 101
#define ERR_NORESPONE 102
// This class is exported from the Packet.dll

namespace Packet
{
//包头结构
typedef struct tagHEAD
{
ULONG uCommand; //命令
ULONG uSequence; //包序号(长连接)
USHORT usBodyLength; //包体长度
UCHAR ucResponseType; //0:不用返回; 1:要返回
UCHAR ucLinkType; //0:短连接; 1:长连接
}HEAD, *pHEAD;

//项目头结构
typedef struct tagITEM
{
ULONG uID; //项目标识
USHORT usDataType; //项目数据类型
USHORT usDataLength; //项目长度
}ITEM, *pITEM;

//数据项的类,内容使用
class PACKET_API CItem
{
public:
CItem();
virtual ~CItem();
CItem(const CItem& item);
const CItem& operator=(const CItem& item);

//外部调用的方法
public:
//设置有符号整型的数据
int SetInt(IN ULONG uID, IN INT uData);
//取有符号整型的数据
int GetInt(OUT ULONG &uID, OUT INT& uData);
//设置浮点型的数据
int SetFloat(IN ULONG uID, IN FLOAT uData);
//取浮点类型的数据
int GetFloat(OUT ULONG &uID, OUT FLOAT& uData);
//设置无符号长整型的数据
int SetULong(IN ULONG uID, IN ULONG uData);
//取无符号长整型的数据
int GetULong(OUT ULONG &uID, OUT ULONG& uData);
//设置字符串型的数据
int SetString(IN ULONG uID, LPCTSTR lpszData);
//取字符串型的数据
int GetString(OUT ULONG &uID, OUT char** ppData);
//取字符串型的数据
//设置二进制型的数据
int SetBinary(IN ULONG uID, IN LPCTSTR lpszData, IN USHORT usDataLength);
//取二进制型的数据
int GetBinary(OUT ULONG &uID, OUT char *lpszData, IN OUT USHORT &usDataLength);
//取项目头结构指针
ITEM* GetItemHeadPtr() { return &m_Item; };
//取项目数据指针
char* GetItemDataPrt() { return m_pData; };

呀,文件太长,发不完,谁如果有兴趣能完成这些代码,来信跟我要全部的头文件吧。tracy10@hotmail.com
...全文
239 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
n_yHHy_n 2009-03-10
  • 打赏
  • 举报
回复
m
yuhaozx 2009-03-10
  • 打赏
  • 举报
回复
关注

7,540

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 VC.NET
社区管理员
  • VC.NET社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧