用CSocket实现网络编程,现在需要传送一个自定义的结构体,如何用CSocket和CArchive实现?
有其它更简单的方法实现么?

解决方案 »

  1.   

    SOCKET
    client
    1.create
    2.connect
    3.send
    server
    1.create
    2.bind
    3.listen
      

  2.   

    我现在还不知道csocketfile和Archive都是干什么用的
    看msdn看不懂
      

  3.   


    构造一个类CSocketFile的对象  CSocketFile file(&cli_s) ; 
    构造类CArchive的对象arIn、arOut,以用于数据的收和发。 
    CArchive arIn(&file , CArchive ::load) ;
    CArchive arOut(&file , CArchive ::store) ; 
    使用arIn和 arOut 进行收或发数据arIn >> value ;arOut << value ;
    其中,value是所传输的数据  
    摧毁所创建的CSocket、CSocketFile 、CArchive 等类的对象
      

  4.   

    我想问,如果不是用CSocket而是用winsock那如何传递结构呢??
      

  5.   

    to 勇敢的心:看了很多例子,搞不太清楚的就是“value”的意思,如过我定义一个结构体
    type people
    {   char* name;
        char* home;
        char* age;
    } Jack那么这个arIn >> value ;arOut << value 到底具体怎么写?
    然后又是怎么发送的呢?
      

  6.   

    struct _data
    {
    char f1[1024];
    char f2[1024];
    }data;
    strcpy(data.f1,...)send(sock,(char*)&data,sizeof(data),0);recv(sock,&data,sizeof(data));
      

  7.   

    to  howtotell(从何谈起) 
    我用你的方法,为什么客户端一发送数据,服务端的程序就退出了啊?
      

  8.   

    问题找到了:recv(sock,&data,sizeof(data));改成recv(sock,(char*)&data,sizeof(data));
      

  9.   

    呵呵,一不小心就灌到两个角了!
    你看看这个:
    class CMessg : public CObject
    {
    protected:
        DECLARE_DYNCREATE(CMessg)
    public:
        CMessg();可用如下的代码定义数据包// Attributes
    public:
        你的数据成员;// Operations
    public:
        void Init();// Implementation
    public:
        virtual ~CMessg();
        virtual void Serialize(CArchive& ar);   // overridden for document i/o
                                           //转化成流
    #ifdef _DEBUG
        virtual void AssertValid() const;
        virtual void Dump(CDumpContext& dc) const;
    #endif
    };
      

  10.   

    oyljerry(勇敢的心) :看了你定义的类,不过不太明白怎么用啊,而且这个和howtotell(从何谈起)说的方法好像不太一样,按howtotell(从何谈起)说的是不是可以直接发送结构体?你说的方法是要用Serialize(CArchive& ar),可不可以再详细一点说,具体怎么发送接收呢?gold_jin() :我用的是CSocket,我也想过将结构中的数据一个一个的传,但是有个问题,比如说,我先发送了结构体中的name数据,接着发送结构体中的age数据,在接收的时候,我如何知道接收到的包是结构体中的哪个数据?
      

  11.   

    class CMsg : public CObject
    {
    public:
    CMsg();
    virtual ~CMsg();
    public:
    int type;
    CString from;
    CString to;
    //CString sender;
    CString m_str;
    public:
    void Serialize(CArchive& ar);
    };
    void CMsg::Serialize(CArchive& ar)
    {
    // 发送消息
    if(ar.IsStoring())
    {
    ar << type;
    ar << from;
    ar << to;
    ar << m_str;
    }
    // 接收消息
    else
    {
    ar >> type;
    ar >> from;
    ar >> to;
    ar >> m_str;
    }
    }
    CArchive* m_in;
    CArchive* m_out;
    m_in = new CArchive(m_socketfile, CArchive::load);
    m_out = new CArchive(m_socketfile, CArchive::store);void CClientSocket::OnReceive(int nErrorCode)
    {
    TRY
    {
    msg.Serialize(*m_in);
    ProcessMessage();
    return true;
    }
    CATCH(CException, e)
    {
    m_in->Abort();
    return false;
    }
    END_CATCH CSocket::OnReceive(nErrorCode);
    }
    bool CMyQQApp::SendMsg(void)
    {
    if(m_out != NULL)
    {
    TRY
    {
    msg.Serialize(*m_out);
    m_out->Flush();
    return true;
    }
    CATCH(CException, e)
    {
    m_out->Abort();
    delete m_out;
    m_out = NULL;
    return false;
    }
    END_CATCH
    } return false;
    }
      

  12.   

    万分感谢啊!原来用>>和<<就可以发送接收了,而不需要用send和recev了?看着感觉怪怪的,看来我还是没弄明白它的原理,大侠可以赐教么?
      

  13.   

    to 勇敢的心:我有些明白了,如果让你创建的类继承CObject,那么就会继承Serialize()函数,可以用来将由这个类生成的对象序列化,可是序列化完成后如何发送,如何接收?
      

  14.   

    to  libraworm(我要改名)我用了你的方法,可是,接收数据时在执行到
    if(ar.IsStoring())这个判断语句时出现了问题:Server.exe 中的 0x7c250a3b (mfc70d.dll) 处未处理的异常:0xC0000005: 读取位置 0xcdcdcde5 时发生访问冲突。
      

  15.   

    无论如何我不建议你使用mfc socket
    因为问题实在太大,特别是在vs.net 2003中
    很多怪异的现象
    还是用api socket保险
      

  16.   

    如果不用mfc的序列化,该如何传递结构,并从结构中取得成员值
      

  17.   

    to beizijing(jing) 
    我现在在想用send,recv的方法。:-)
    我发现用send ,recv接收数据时,发现接收的数据在发送的数据后面多一些莫名其妙的数据?呵呵,不知道什么原因!
      

  18.   

    to 勇敢的心:不好意思,我是菜鸟,能把你的几种方法,贴一些代码出来么?才开始howtotell(从何谈起)说的方法,我想知道你是怎么解决分离接收的数据的,还有你自己说的那个类,是怎么进行发送接收的?