我自定义一个数据结构,里面的数据有CString、int等,如何用send发送然后用recv接接收

解决方案 »

  1.   

    用C C++搞网络编程,在数据传输上,一般使用自己定义的struct,来串行化数据,然后再发送;接收的时候再根据定义好的struct来recv。象lz想把Cstring的东西send出去,最好是拿到CString里面包含的字串,放到自己的struct里面,recv到了之后再转成CString
      

  2.   

    我定义
    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类型的收不到,并且发送和接收的字节数一样
      

  3.   

    不要定义CString,用char[]或者BYTE[]
    CString不是是复合数据结构
      

  4.   

    自己定义个规则吧。。类似TLV格式
      

  5.   

    其实我们所说的通讯协议一般都包含两种协议
    一种是通讯协议 一种是数据协议,很多新手都搞不清楚
    比如说你这里用的是tcp通讯协议,现在你有固定性质的数据想要发送(就是你的结构体)
    那么你就要为它选择或者设置一种数据协议,根据需求这种数据协议可以很复杂(可以包含数据类型,时间戳等等),也可以很简单,直接按域隔断。一头生成一头做解析(也就是序列化和反序列化的过程),可以单向或者双向
    ====================================
    这方面比较好的资料可以参考ace的
    ACE_OutputCDR ACE_InputCDR 这两个序列化类的源码
      

  6.   

    另外需要补充的是这种协议的生成或者解析一般都是用字节流也就是char数据,因为这和网络字节许有关。而你这种方法,如果两端的字节序或者内存对齐方法不一样,数据肯定是乱掉的,在深一点的知识我也没有深入研究过
      

  7.   

    定义传送的数据结构时,还应该注意内存对齐问题,否则接收的数据转换成数据结构对象时,char数组对应的字符串后面会有一些乱码出现,不利于分析数据结构最好为4的倍数
      

  8.   


    //发送端
    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网络编程>>
      

  9.   

    还有就是我做过的一种钢铁行业的协议,它为了避免:在字符串中有可能被使用,它用了比较小概率用到的$作为分隔符
    =====================================================================
    另外这只是具体协议格式当中的一种,数据协议格式有很多,可以看TCP/IP协议第一卷,各种协议的报文格式就是数据协议的一种,但是这种比较麻烦,一般在应用层很少这么干