自己定义的结构体。怎么在socket中传送和接收阿
比如
typedef struct myStr
{
char str[100];
int i;
         double m,
         CString mystring;
         
}mystr,*mystr;
结构体如何进入send()函数,recv函数又如何接收并提取出来啊~~~在线等
谢谢先~

解决方案 »

  1.   

    可以啊,其实很简单,把你的数据串行化,然后发送,那边什么都不用变化直接还原映射到内存中就行啦。串行化可以使用微软的MFC,如果想自己写一个也很简单,给你一个串行化的源码。#define  POINTER_TYPE(a) ((a*)NULL), __true_type()
    #define  ENTITY_TYPE(a)  ((a*)NULL), __false_type()#include "ISerial.h"
    #include <STRING>
    #include <VECTOR>
    #include <MAP>
    #include <stl/type_traits.h>#ifndef sint8typedef signed __int8 sint8;
    typedef unsigned __int8 uint8;
    typedef signed __int16 sint16;
    typedef unsigned __int16 uint16;
    typedef signed __int32 sint32;
    typedef unsigned __int32 uint32;
    typedef signed __int64 sint64;
    typedef unsigned __int64 uint64;typedef       int sint; // at least 32bits (depend of processor)
    typedef unsigned int uint; // at least 32bits (depend of processor)_STLP_BEGIN_NAMESPACE
    template<> struct __type_traits<sint8> : __type_traits_aux<1> {};
    template<> struct __type_traits<uint8> : __type_traits_aux<1> {};
    template<> struct __type_traits<sint16> : __type_traits_aux<1> {};
    template<> struct __type_traits<uint16> : __type_traits_aux<1> {};
    template<> struct __type_traits<sint32> : __type_traits_aux<1> {};
    template<> struct __type_traits<uint32> : __type_traits_aux<1> {};
    _STLP_END_NAMESPACE#endifusing namespace std;#ifndef _ARCHIVE_ENTITY_H
    #define _ARCHIVE_ENTITY_Hclass CIArchive
    {
    public:
    enum 
    {
    R = 0,
    W = 1
    }; CIArchive(CISerial* pISerial, int mode);
    ~CIArchive(); bool IsReading()  { return (m_nMode == R); } template<class T>
    void Serial(T &obj)
    {
    TSerial(obj, __type_traits<T>::has_trivial_copy_constructor());
    } template<class T>
    void TSerial(T &obj, __false_type)
    {
    obj.Serial(*this);
    } template<class T>
    void TSerial(T &obj, __true_type)
    {
    (m_pISerial->*m_SerialFunc)(&obj, sizeof(T));
    } template<class T, class T0>
    void Serial(vector<T>* vec, T0* t, __false_type)
    {
    if(IsReading())
    {
    uint16 u2Len;

    Serial(u2Len);
    for(int i = 0; i < u2Len; i++)
    {
    T t;
    Serial(t);
    vec->push_back(t);
    }
    }
    else
    {
    uint16 u2Len = vec->size();
    Serial(u2Len); for(int i = 0; i < u2Len; i++)
    {
    Serial((*vec)[i]);
    }
    }
    } template<class T, class T0>
    void Serial(vector<T>* vec, T0* t, __true_type)
    {
    if(IsReading())
    {
    uint16 u2Len;

    Serial(u2Len);
    for(int i = 0; i < u2Len; i++)
    {
    T0* t = new T0;
    Serial(*t);
    vec->push_back(t);
    }
    }
    else
    {
    uint16 u2Len = vec->size();
    Serial(u2Len); for(int i = 0; i < u2Len; i++)
    {
    Serial(*(*vec)[i]);
    }
    }
    } template<class K, class T, class T0>
    void Serial(map<K,T>* m, T0* t0, __true_type)
    {
    if(IsReading())
    {
    uint16  u2Len;
    Serial(u2Len); K k;
    for(int i = 0; i < u2Len; i++)
    {
    Serial(k);
    T0 t = new T0;
    Serial(*t);
    m->insert(map<K,T>::value_type(k,t));
    }
    }
    else
    {
    uint16 u2Len = m->size();
    Serial(u2Len); map<K,T>::iterator s = m->begin();
    map<K,T>::iterator e = m->end(); for(; s !=e; s++)
    {
    Serial((K)(s->first));
    Serial(*(s->second));
    }
    }
    } template<class K, class T, class T0>
    void Serial(map<K,T>* m, T0* t0, __false_type)
    {
    if(IsReading())
    {
    uint16 u2Len;
    Serial(u2Len);

    K k;

    for(int i = 0; i < u2Len; i++)
    {
    Serial(k);

    T t;
    Serial(t);
    m->insert(map<K,T>::value_type(k,t));
    }
    }
    else
    {
    uint16 u2Len = m->size();
    Serial(u2Len); map<K,T>::iterator s = m->begin();
    map<K,T>::iterator e = m->end(); for(; s !=e; s++)
    {
    Serial((K)(s->first));
    Serial((T)(s->second));
    }
    }
    }

    void Serial(string &a);
    void Serial(char* szBuf, uint16 uSize); // help function
    int Error();private:
    CISerial*   m_pISerial;
    SERIAL_FUNC m_SerialFunc;
    int         m_nMode;
    };
    #endif
      

  2.   

    不要用CString 类型,因为它是变长的
      

  3.   

    //发送端typedef struct myStr
    {
    char str[100];
    int i;
             double m,
             CString mystring;
             
    }mystr,*mystr;.......................myStr sendstr;send(sockid,(char*)sendstr,sizeof(myStr),0);//接收端,同样定义这个结构体
    typedef struct myStr
    {
    char str[100];
    int i;
             double m,
             CString mystring;
             
    }mystr,*mystr;.......................myStr *recvstr;       //注意,在这里用指针char recvbuf[1024];
    recv(sockid,recvbuf,1024,0);
    recvstr = (myStr*)recvbuf;在这里已经完成,数据已经填充到了recvstr这个指针中了·
      

  4.   

    这句错了
    send(sockid,(char*)sendstr,sizeof(myStr),0);改为
    send(sockid,(char*)&sendstr,sizeof(myStr),0);
      

  5.   

    同意nuaawenlin(飘人) 的说法,CStirng是可变长度,对于接收端来说无法正确读取的,建议采用定长字符数组
    其他的就是
    send(socket,(char*)&sendstr,sizeof(myStr),0)
    recv(socket,(char*)&recvstr,sizeof(myStr),0)
    这样就基本可以用了呀