C++,Socket TCP 怎么发送多种格式的报文

C++,Socket TCP 如何发送多种格式的报文
报文的数据类型比较多:  有  unsinged int,float,string,bool, 如何按字节打包发送呢??

Socket  的 send函数,是发送char*的, 

这个怎么打包报文呢???

怎么按字节拼凑起来 发送呢???

发送后,怎么按字节解析呢???
------解决思路----------------------
自己定义一个打包格式,或者干脆定义一个结构体,整个结构体发送
------解决思路----------------------
先算出你要发送的数据长度,然后char *sendbuff  = new char(长度),然后将你要发的数据按顺序依次拷入到sendbuff中就可以了,接收方也需要按你的规则解析数据,这种多种数据类型的发送与接收,最好自己封装成一个类来完成

给你一个我以前封装的类,你可以直接用

/*================================================================*
// NSDataParser.h: interface for the CNSDataParser class.
【头文件】: NSDataParser.h
【功  能】: 该模块属于独立模块,主要完成管理各种类型数据,
转换成一个连续的内存数据块。返回的连续数据块为LPVOID类型,
通过GetData()函数获取到该数据块的地址,通过GetDataSize()
返回数据块的大小
【注  意】:
*================================================================*/
#if !defined(AFX_DATAPARSER_H__C18BF820_ED69_42B0_A8F9_9570387F753C__INCLUDED_)
#define AFX_DATAPARSER_H__C18BF820_ED69_42B0_A8F9_9570387F753C__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <afxtempl.h>
//=========================================================================
//=========================================================================
class  CDataParser
{
public:
CDataParser();
virtual ~CDataParser();
public:
// 将数据写入内存
/*================================================================*
【函數】: Add(...)
【功能】: 往内存中添加各种数据,数据内存所占的长度会根据所加入的
数据类型动态增加
【参数】:
【返回】:
【例子】:
【注意】: 当参数为CNSVarObj类型时,往内存中加的是变量的工程值,
即pVar->GetVarData(),并不是把变量对象中所有数据全加入内存
*================================================================*/
virtual BOOL Add(COleVariant* pvData);
virtual BOOL Add(WORD wData);
virtual BOOL Add(DWORD wData);
virtual BOOL Add(LPVOID pData,int iLen);
virtual BOOL Add(BOOL wData);
virtual BOOL Add(BYTE wData);
virtual BOOL Add(char wData);
virtual BOOL Add(short wData);
virtual BOOL Add(long wData);
virtual BOOL Add(float wData);
virtual BOOL Add(double wData);
virtual BOOL Add(const COleDateTime& wData);
virtual BOOL Add(const CString& strData);
public:
// 从内存中读取值,注:先调用InitData初始化内存数据然后再调用GetData
virtual void InitData( void *pData,unsigned long nDataSize);
virtual BOOL GetData(COleVariant& pvData);
virtual BOOL GetData(WORD &wData);
virtual BOOL GetData(DWORD &wData);
virtual BOOL GetData(LPVOID pData);
virtual BOOL GetData(BOOL &wData);
virtual BOOL GetData(BYTE &wData);
virtual BOOL GetData(char &wData);
virtual BOOL GetData(short &wData);
virtual BOOL GetData(long &wData);
virtual BOOL GetData(float &wData);
virtual BOOL GetData(double wData);
virtual BOOL GetData(COleDateTime& wData);
virtual BOOL GetData(CString& strData);
// 获取当前内存位置
unsigned long GetCurrentPos();
public:
/*================================================================*
【函數】: RemoveAllDataItem()
【功能】: 删除所有数据将所占的内存清空
【参数】:
【返回】: 返回BOOL类型,成功为TRUE,否则为FALSE
【例子】:
【注意】:
*================================================================*/
virtual BOOL RemoveAllDataItem();

/*================================================================*
【函數】: GetData()
【功能】: 获取连续内存地址
【参数】:
【返回】: 返回指向内存的首地址
【例子】:
【注意】:
*================================================================*/
virtual LPVOID  GetData();

/*================================================================*
【函數】: GetDataSize()
【功能】: 获取连续内存的大小
【参数】:
【返回】: 返回指向内存的大小
【例子】:
【注意】:
*================================================================*/
virtual DWORD GetDataSize();
protected:
double VarToDouble(COleVariant* pvData);
protected:
// 数据大小
UINT m_uDataSize;
// 数据
LPVOID m_pData;
// 内存需要删除标志
bool m_bMustClean;
unsigned long m_pCurDataPos;
private:
CRITICAL_SECTION CRITICAL_LOCK;
};
#endif // !defined(AFX_DATAPARSER_H__C18BF820_ED69_42B0_A8F9_9570387F753C__INCLUDED_)



------解决思路----------------------
不管哪种类型,后台都是二进制。
------解决思路----------------------
unsinged int,float,string,bool


typedef struct MYMSG
{
    unsinged int uX1;
    float fX2;
    char szX3[30];
    bool bX4;
}MyMsg,*PMyMsg;
MyMsg msg;

int nSendLen = send(skt,(char*)&msg,sizeof(MyMsg))

------解决思路----------------------
不需要这么麻烦,给一个简单demo


#include "stdafx.h"   
//#include <altstr.h> 
#include <iostream>  
using namespace std;  

typedef struct MYMSG
{
unsigned int uX1;
float fX2;
char szX3[30];
bool bX4;
}MyMsg,*PMyMsg;

int main()  
{  
MyMsg msg;
msg.uX1=100;
msg.fX2=100.0;
memcpy(msg.szX3,"abcd",30);
msg.bX4=true;
//cout << sizeof(msg) << endl;//40

//发送部分
char strSend[40];//strSend为发送的内容
memcpy(strSend,(char*)&msg,40);

//接收部分
char strRecv[40];
memcpy(strRecv,strSend,40);//假设strSend即是接收的内容
MyMsg msgRecv;
memcpy(&msgRecv,(MyMsg*)&strRecv,40);

system("pause");
}  


------解决思路----------------------
不管你有多少类型,把这些类型定义在一个结构体里面。按下面步骤。
发送方
1、创建这个结构体对象;
2、给结构体对象中的成员赋值;
3、send结构体对象指指针;

接收方
1、recv到数据;(char*类型的);
2、memcpy 接收到的数据char*,拷贝到发送方定义的结构体类型的对象中。

OK。