用send/recv处理数据结构的发送 我自定义一个数据结构,里面的数据有CString、int等,如何用send发送然后用recv接接收 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 用C C++搞网络编程,在数据传输上,一般使用自己定义的struct,来串行化数据,然后再发送;接收的时候再根据定义好的struct来recv。象lz想把Cstring的东西send出去,最好是拿到CString里面包含的字串,放到自己的struct里面,recv到了之后再转成CString 我定义struct Msg{public: int password; CString name; };发送端 Msg msg;//=new Msg; msg.name="shao"; msg.password=81391225; char * buf=(char*)&msg; int len=sizeof(msg); int leng=send(m_client,buf,len,0);接收端 Msg msg; long lLength = sizeof(Msg); char * Buffer = new char[lLength];int lenth=recv(m_sockConn,(char*)&msg,lLength,0);Msg* pMsg=(Msg*)Buffer;结果是只能收到int类型的数据,CString类型的收不到,并且发送和接收的字节数一样 不要定义CString,用char[]或者BYTE[]CString不是是复合数据结构 自己定义个规则吧。。类似TLV格式 其实我们所说的通讯协议一般都包含两种协议一种是通讯协议 一种是数据协议,很多新手都搞不清楚比如说你这里用的是tcp通讯协议,现在你有固定性质的数据想要发送(就是你的结构体)那么你就要为它选择或者设置一种数据协议,根据需求这种数据协议可以很复杂(可以包含数据类型,时间戳等等),也可以很简单,直接按域隔断。一头生成一头做解析(也就是序列化和反序列化的过程),可以单向或者双向====================================这方面比较好的资料可以参考ace的ACE_OutputCDR ACE_InputCDR 这两个序列化类的源码 另外需要补充的是这种协议的生成或者解析一般都是用字节流也就是char数据,因为这和网络字节许有关。而你这种方法,如果两端的字节序或者内存对齐方法不一样,数据肯定是乱掉的,在深一点的知识我也没有深入研究过 定义传送的数据结构时,还应该注意内存对齐问题,否则接收的数据转换成数据结构对象时,char数组对应的字符串后面会有一些乱码出现,不利于分析数据结构最好为4的倍数 //发送端char sText[256]={0};msg.name="shao";msg.password=81391225;sprintf(sText,"%d:%s\t\n",msg.password,msg.name);//注意这里一次发送一行数据int leng=send(m_client,sText,strlen(sText)+1,0); //接收端,每次只接受一行数据,之后对:进行解析从新生成你的msg数据即可==========================================================================这种方法可以参考<<UNIX网络编程>> 还有就是我做过的一种钢铁行业的协议,它为了避免:在字符串中有可能被使用,它用了比较小概率用到的$作为分隔符=====================================================================另外这只是具体协议格式当中的一种,数据协议格式有很多,可以看TCP/IP协议第一卷,各种协议的报文格式就是数据协议的一种,但是这种比较麻烦,一般在应用层很少这么干 不用 DataEnvironment1 可否实现报表的分组 ,如何 传递 变量给 DataEnvironment1 奇怪的错误 error LNK2019: 无法解析的外部符号 IE7中ActiveX有对话框销毁时失败 第一个文件是怎么开启的?(<<深入浅出MFC>>中没讲清楚的). 双缓冲的问题 寻VC比较厉害的人物,交个朋友,互相切磋。 在VC6里怎么使用GDI+? 高手们,来拿高分呀! 如何登陆安装了serv-u的(不能匿名的)ftp服务器? 谁有MFC ODBC实例详解的资料啊 急求啊 如何获取缩略图的点阵 如何把多字节字符集项目向unicode项目移植
struct Msg
{
public:
int password;
CString name;
};
发送端 Msg msg;//=new Msg;
msg.name="shao";
msg.password=81391225;
char * buf=(char*)&msg;
int len=sizeof(msg);
int leng=send(m_client,buf,len,0);接收端
Msg msg;
long lLength = sizeof(Msg);
char * Buffer = new char[lLength];int lenth=recv(m_sockConn,(char*)&msg,lLength,0);Msg* pMsg=(Msg*)Buffer;结果是只能收到int类型的数据,CString类型的收不到,并且发送和接收的字节数一样
CString不是是复合数据结构
一种是通讯协议 一种是数据协议,很多新手都搞不清楚
比如说你这里用的是tcp通讯协议,现在你有固定性质的数据想要发送(就是你的结构体)
那么你就要为它选择或者设置一种数据协议,根据需求这种数据协议可以很复杂(可以包含数据类型,时间戳等等),也可以很简单,直接按域隔断。一头生成一头做解析(也就是序列化和反序列化的过程),可以单向或者双向
====================================
这方面比较好的资料可以参考ace的
ACE_OutputCDR ACE_InputCDR 这两个序列化类的源码
//发送端
char sText[256]={0};
msg.name="shao";
msg.password=81391225;
sprintf(sText,"%d:%s\t\n",msg.password,msg.name);//注意这里一次发送一行数据
int leng=send(m_client,sText,strlen(sText)+1,0);
//接收端,每次只接受一行数据,之后对:进行解析从新生成你的msg数据即可==========================================================================
这种方法可以参考<<UNIX网络编程>>
=====================================================================
另外这只是具体协议格式当中的一种,数据协议格式有很多,可以看TCP/IP协议第一卷,各种协议的报文格式就是数据协议的一种,但是这种比较麻烦,一般在应用层很少这么干