CArchive Frage



  • ich will mein objekt in einem CArchive einpacken, dann direkt auslesen
    etwa so

    class CMyTestClass
    {
    public:
      int i;
      double d;
      CString m_classname;
      void Serialize(CArchive& ar)
      {
        if(ar.IsLoading())
        {
    	ar >> i >> d >> m_classname;
        }
        else
        {
    	ar << i<< d<<m_classname;
        }
      }
    };
    
    CMyTestClass mytestobj, mytestobj2;
    
    CSocketFile sMySocketFile(&as, TRUE);
     CArchive lArchive(&sMySocketFile, CArchive::store);
     as.Serialize(lArchive);
     lArchive.Flush();
     mytestobj.Serialize(lArchive);
    
     //jetzt auslesen
     CArchive lArchive2(&sMySocketFile, CArchive::load);
     as.Serialize(lArchive);
     lArchive2.Flush();
     mytestobj2.Serialize(lArchive2);
    

    sobald wenn ich in CArchive lArchive2(&sMySocketFile, CArchive::load); "load"verwende, ist lArchive2.IsBufEmpty immer true, dann crasht es bei

    ar >> i >> d >> m_classname;
    

    wieso?



  • Ich hab ehrlich gesagt nicht allzu viel Ahnung
    von Netzwerkkommunikation, aber wenn du von
    einem Netzwerk liest, dann muss doch irgendwo
    am anderen Ende jemand schreiben, oder?

    Ich glaube nicht, dass du die Daten, die du
    in ein Socket geschrieben hast, dort wieder
    herausbekommst.

    (Angaben ohne Gewähr 🙂

    Alex



  • ich habe es noch nicht gesendet, nur serializiert, und quasi direkt danach deserialisieren will


  • Mod

    Ein Socket funktioniert doch nicht wie eine Datei... Du kannst nicht auf der selben Seite lesen auf der Du die Daten geschrieben hast, und das machst Du hier!



  • Andere Idee:
    Bei einem normalen CFile-Objekt steht man nach
    dem schreiben am Ende der Datei.
    D.h. man benötigt noch ein SeekToBegin().

    Ob das beim CSocketFile genauso ist, weiß ich nicht.

    Alex



  • ich habe da ein test program geschrieben, funktioniert teilweise.
    Problem ist ich muss immer 2 mal onsend drücken
    Es hängt bei erstmal immer an der folgenden Stelle:

    class CMyTestClass : public CObject
    {
    public:
      CString m_classname;
      int i; 
      void Serialize(CArchive& ar)
      {
       if(ar.IsLoading())
       {
         ar >> m_classname >> i;//hier freeze
       }
       else
       {
         ar <<m_classname<<i;
       }
      }
    };
    

    wenn ich 2.mal onsend Button drücke, dann geht eine Zeile weiter.



  • problem gelöst, hatte 2 mal die daten rausgeholt.



  • jetzt habe wieder ein problem,
    ich habe 2 applicationen, die mit socket gegenseitig daten austauschen (server und client). ich will aber Objekt senden, nicht primitive Typen,dann an der Empfangseite wieder das Objekt zusamenbauen, daher versuche ich mit CArchive::Serialize(), irgendwie habe ich falsch gemacht

    //socket class
     class CMySocket : public CSocket
    {
    public:
      BOOL Create(UINT nSocketPort = 0, int nSocketType=SOCK_STREAM)
     {
      return CSocket::Create(nSocketPort);
     };
     BOOL Listen(int nConnectionBacklog=5)
     {
      return CSocket::Listen(nConnectionBacklog);
     }
    
     virtual BOOL Accept(CAsyncSocket& rConnectedSocket, SOCKADDR* lpSockAddr =  NULL, int* lpSockAddrLen = NULL)
    {
     return CSocket::Accept(rConnectedSocket, lpSockAddr,lpSockAddrLen);
    }  
    virtual void Close()
    {
      CSocket::Close();
    }
    virtual int Receive(void* lpBuf, int nBufLen, int nFlags = 0)
    {
      CSocketFile* sMySocketFile = (CSocketFile*)lpBuf;
      CArchive lArchive(sMySocketFile, CArchive::load);
      CMyTestClass target;					
      target.Serialize(lArchive);
      lArchive.Close();
      sMySocketFile->Close();
      return CSocket::Receive(lpBuf, nBufLen,nFlags);
    }		
    };
    //MyTestClass und CMySocket sind beider Seite bekant (2 mal geschrieben)
    class MyTestClass : public CObject
    {
    public:
    	CString str;
    	void Serialize(CArchive& ar)
    	{
    		CObject::Serialize(ar);
    		if (ar.IsLoading())
    		{
    			ar >> str; //crash auf der Empfangseite
    		}
    		else
    		{
    			ar << str;
    		}
    	}
    };
    

    //server app

    sockSrvr.Create(34000);   //   Creates   our   server   socket  
    sockSrvr.Listen();   //   Start   listening   for   the   client   at   PORT CMySocket   sockRecv;  
    sockSrvr.Accept(sockRecv);   //   Use another CSocket to accept the connection  
    
    MyTestClass t;
    t.str = "hello world";
    
    CSocketFile sMySocketFile(&sockSrvr, TRUE);
    CArchive lArchive(&sMySocketFile, CArchive::store);
    t.Serialize(lArchive);
     sockRecv.Send((void*)&sMySocketFile,   20);   //was sende ich überhaupt???
     lArchive.Close();
     sMySocketFile.Close();
    

    client app

    CMySocket   sockClient;  
    sockClient.Create();  
    sockClient.Connect("127.0.0.1",   34000);    
    MyTestClass target;
    sockClient.Receive(&target,   20);
    CSocketFile sMySocketFile(&sockClient, TRUE);
    CArchive lArchive(&sMySocketFile, CArchive::load);
    target.Serialize(lArchive);
    lArchive.Close();
    sMySocketFile.Close();
    

    und ich will nicht die Daten in einer Datei speichern und dann auslesen.
    was mache ich hier falsh?



  • Schau doch mal bei CodeProject vorbei da wirst du fündig, und auch google hätte die geholfen

    http://www.codeproject.com/KB/IP/Serialize_using_Sockets.aspx

    Du bist ja net der erste der so was verwenden will

    Gruß Matthias


Anmelden zum Antworten