C++,Socket TCP 如何发送多种格式的报文

Yo1988 2015-04-06 09:55:44
报文的数据类型比较多: 有 unsinged int,float,string,bool, 如何按字节打包发送呢??

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

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

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

发送后,怎么按字节解析呢???
...全文
1443 27 打赏 收藏 转发到动态 举报
写回复
用AI写文章
27 条回复
切换为时间正序
请发表友善的回复…
发表回复
七重孤独 2015-06-14
  • 打赏
  • 举报
回复
这是个什么情况呀?
brk1985 2015-04-08
  • 打赏
  • 举报
回复
不需要这么麻烦,给一个简单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");
}  

Yo1988 2015-04-08
  • 打赏
  • 举报
回复
@孤客天涯 @brk1985 @xihu1364 @SiGoYi 谢谢你们的帮忙!万分感谢! 向你们学习!!
Yo1988 2015-04-08
  • 打赏
  • 举报
回复
@jason_wentzel 谢谢了! 我先把实际需求满足了,再好好学习你的封装类! 真的是太谢谢了
孤客天涯 2015-04-08
  • 打赏
  • 举报
回复
引用 17 楼 zhuhailong3812906 的回复:
[quote=引用 11 楼 xihu1364 的回复:] 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))
这个是封装成结构体,客户端发送出去的。 那服务器端,接收到这个(char*)&msg后,怎么处理呢?? [/quote] typedef struct MYMSG { unsinged int uX1; float fX2; char szX3[30]; bool bX4; }MyMsg,*PMyMsg; MyMsg msg; int nLen = recv(skt,(char*)&msg,sizeof(MyMsg))
绿领巾童鞋 2015-04-08
  • 打赏
  • 举报
回复
对,本质都是字节流拼接。
SiGoYi 2015-04-08
  • 打赏
  • 举报
回复
不管你有多少类型,把这些类型定义在一个结构体里面。按下面步骤。 发送方 1、创建这个结构体对象; 2、给结构体对象中的成员赋值; 3、send结构体对象指指针; 接收方 1、recv到数据;(char*类型的); 2、memcpy 接收到的数据char*,拷贝到发送方定义的结构体类型的对象中。 OK。
Yo1988 2015-04-07
  • 打赏
  • 举报
回复
@jason_wentzel 谢谢了 用的VS2005 修改c/c++选项中的Language,将Treat WChar_t Build in Type 改成No(/Zc:wchar_t) 后 编译通过了! 万分感谢!!
孤客天涯 2015-04-07
  • 打赏
  • 举报
回复
引用 14 楼 zhuhailong3812906 的回复:
[quote=引用 13 楼 jason_wentzel 的回复:] [quote=引用 12 楼 zhuhailong3812906 的回复:] [quote=引用 10 楼 jason_wentzel 的回复:]

/*================================================================*
【函數】:	ConvertStringToChar()
【功能】:	将UNICODE 或ANSI CString 转换成char*
【参数】:	str : 要转换的字符串
【返回】:	返回转换后的char *
【例子】:	
【注意】:	返回后的char*需delete掉
*================================================================*/
char *CUtility::ConvertStringToChar(const CString &str)
{
	char *chReturn = NULL;
	BSTR bstr = str.AllocSysString();
	chReturn = _com_util::ConvertBSTRToString(bstr);
	SysFreeString(bstr);
	return chReturn;
}
添加之后 报了两个错误: 1>Linking... 1>DataParser.obj : error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)" (?ConvertBSTRToString@_com_util@@YGPADPA_W@Z) referenced in function "public: char * __thiscall CDataParser::ConvertStringToChar(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" (?ConvertStringToChar@CDataParser@@QAEPADABV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) 1>C:\Users\Administrator\Desktop\ClientForSegProtocol\ClientForSegProtocol\Debug\ClientForSegProtocol.exe : fatal error LNK1120: 1 unresolved externals [/quote] #include <comutil.h> //_com_util::ConvertBSTRToString #pragma comment(lib, "comsupp.lib") //_com_util::ConvertBSTRToString[/quote] 这头文件 跟链接都 添加了 但还是报这2个错误[/quote] 你用的是VS多少 你找到c/c++选项中的Language,将Treat WChar_t Build in Type 改成No(/Zc:wchar_t)
Yo1988 2015-04-07
  • 打赏
  • 举报
回复
引用 13 楼 jason_wentzel 的回复:
[quote=引用 12 楼 zhuhailong3812906 的回复:] [quote=引用 10 楼 jason_wentzel 的回复:]

/*================================================================*
【函數】:	ConvertStringToChar()
【功能】:	将UNICODE 或ANSI CString 转换成char*
【参数】:	str : 要转换的字符串
【返回】:	返回转换后的char *
【例子】:	
【注意】:	返回后的char*需delete掉
*================================================================*/
char *CUtility::ConvertStringToChar(const CString &str)
{
	char *chReturn = NULL;
	BSTR bstr = str.AllocSysString();
	chReturn = _com_util::ConvertBSTRToString(bstr);
	SysFreeString(bstr);
	return chReturn;
}
添加之后 报了两个错误: 1>Linking... 1>DataParser.obj : error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)" (?ConvertBSTRToString@_com_util@@YGPADPA_W@Z) referenced in function "public: char * __thiscall CDataParser::ConvertStringToChar(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" (?ConvertStringToChar@CDataParser@@QAEPADABV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) 1>C:\Users\Administrator\Desktop\ClientForSegProtocol\ClientForSegProtocol\Debug\ClientForSegProtocol.exe : fatal error LNK1120: 1 unresolved externals [/quote] #include <comutil.h> //_com_util::ConvertBSTRToString #pragma comment(lib, "comsupp.lib") //_com_util::ConvertBSTRToString[/quote] 这头文件 跟链接都 添加了 但还是报这2个错误
孤客天涯 2015-04-07
  • 打赏
  • 举报
回复
引用 12 楼 zhuhailong3812906 的回复:
[quote=引用 10 楼 jason_wentzel 的回复:]

/*================================================================*
【函數】:	ConvertStringToChar()
【功能】:	将UNICODE 或ANSI CString 转换成char*
【参数】:	str : 要转换的字符串
【返回】:	返回转换后的char *
【例子】:	
【注意】:	返回后的char*需delete掉
*================================================================*/
char *CUtility::ConvertStringToChar(const CString &str)
{
	char *chReturn = NULL;
	BSTR bstr = str.AllocSysString();
	chReturn = _com_util::ConvertBSTRToString(bstr);
	SysFreeString(bstr);
	return chReturn;
}
添加之后 报了两个错误: 1>Linking... 1>DataParser.obj : error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)" (?ConvertBSTRToString@_com_util@@YGPADPA_W@Z) referenced in function "public: char * __thiscall CDataParser::ConvertStringToChar(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" (?ConvertStringToChar@CDataParser@@QAEPADABV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) 1>C:\Users\Administrator\Desktop\ClientForSegProtocol\ClientForSegProtocol\Debug\ClientForSegProtocol.exe : fatal error LNK1120: 1 unresolved externals [/quote] #include <comutil.h> //_com_util::ConvertBSTRToString #pragma comment(lib, "comsupp.lib") //_com_util::ConvertBSTRToString
Yo1988 2015-04-07
  • 打赏
  • 举报
回复
引用 10 楼 jason_wentzel 的回复:

/*================================================================*
【函數】:	ConvertStringToChar()
【功能】:	将UNICODE 或ANSI CString 转换成char*
【参数】:	str : 要转换的字符串
【返回】:	返回转换后的char *
【例子】:	
【注意】:	返回后的char*需delete掉
*================================================================*/
char *CUtility::ConvertStringToChar(const CString &str)
{
	char *chReturn = NULL;
	BSTR bstr = str.AllocSysString();
	chReturn = _com_util::ConvertBSTRToString(bstr);
	SysFreeString(bstr);
	return chReturn;
}
添加之后 报了两个错误: 1>Linking... 1>DataParser.obj : error LNK2019: unresolved external symbol "char * __stdcall _com_util::ConvertBSTRToString(wchar_t *)" (?ConvertBSTRToString@_com_util@@YGPADPA_W@Z) referenced in function "public: char * __thiscall CDataParser::ConvertStringToChar(class ATL::CStringT<wchar_t,class StrTraitMFC_DLL<wchar_t,class ATL::ChTraitsCRT<wchar_t> > > const &)" (?ConvertStringToChar@CDataParser@@QAEPADABV?$CStringT@_WV?$StrTraitMFC_DLL@_WV?$ChTraitsCRT@_W@ATL@@@@@ATL@@@Z) 1>C:\Users\Administrator\Desktop\ClientForSegProtocol\ClientForSegProtocol\Debug\ClientForSegProtocol.exe : fatal error LNK1120: 1 unresolved externals
版主大哥 2015-04-07
  • 打赏
  • 举报
回复
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))
Yo1988 2015-04-07
  • 打赏
  • 举报
回复
引用 18 楼 zhao4zhong1 的回复:
protobuf XML json
大神,这些太笼统了吧
赵4老师 2015-04-07
  • 打赏
  • 举报
回复
protobuf XML json
Yo1988 2015-04-07
  • 打赏
  • 举报
回复
引用 11 楼 xihu1364 的回复:
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))
这个是封装成结构体,客户端发送出去的。 那服务器端,接收到这个(char*)&msg后,怎么处理呢??
worldy 2015-04-06
  • 打赏
  • 举报
回复
自己定义一个打包格式,或者干脆定义一个结构体,整个结构体发送
孤客天涯 2015-04-06
  • 打赏
  • 举报
回复

/*================================================================*
【函數】:	ConvertStringToChar()
【功能】:	将UNICODE 或ANSI CString 转换成char*
【参数】:	str : 要转换的字符串
【返回】:	返回转换后的char *
【例子】:	
【注意】:	返回后的char*需delete掉
*================================================================*/
char *CUtility::ConvertStringToChar(const CString &str)
{
	char *chReturn = NULL;
	BSTR bstr = str.AllocSysString();
	chReturn = _com_util::ConvertBSTRToString(bstr);
	SysFreeString(bstr);
	return chReturn;
}
孤客天涯 2015-04-06
  • 打赏
  • 举报
回复
引用 8 楼 zhuhailong3812906 的回复:
@jason_wentzel Add函数 实现 char *chAnsiCode = CUtility::ConvertStringToChar(strData); 这一句 编译没通过 头文件 没有 添加 CUtility类 没有这个类的实现,编译报错 怎么解决
上面我提交得不完整,完整的上我空间看,CUtility::ConvertStringToChar只是一个将CString转换成char*的函数,你可以到网上找一个代替一下就可以了
Yo1988 2015-04-06
  • 打赏
  • 举报
回复
@jason_wentzel Add函数 实现 char *chAnsiCode = CUtility::ConvertStringToChar(strData); 这一句 编译没通过 头文件 没有 添加 CUtility类 没有这个类的实现,编译报错 怎么解决
加载更多回复(6)

18,356

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC 网络编程
c++c语言开发语言 技术论坛(原bbs)
社区管理员
  • 网络编程
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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