CAsyncSocket -> Send/Receive



  • @SoUrcerer

    Der Code funzt, hat aber 1. nix mehr mit MFC zutun, und 2. wurden hier 250Byte völlig umsonst verschickt.



  • Korrektur:
    Es ist gar nicht gesagt, dass der Code funzt, denn wenn Send asynchron läuft, ist die Struktur ja gelöscht, bevor sie versendet werden konnte!
    Man müsste also alles mit new anlegen und nicht innerhalb der Funktion wieder löschen.

    [ Dieser Beitrag wurde am 17.03.2003 um 17:02 Uhr von RenéG editiert. ]



  • @RenéG
    richtig, richtig und ähhh richtig.

    Mir ging das auch eigentlich ehr ums prinzip.

    Original erstellt von RenéG:
    -> Die Grössenberechnung und das Senden wird sehr viel komplizierter!

    Kannst du die Lösung mit dem CArchive mal etwas ausführen ... würd mich auch mal interessieren ... Hab damit noch nicht viel gemacht.

    grüsse



  • hmm,

    das ist jetzt auf jedenfall alles schön mal schön und lang erklärt,
    ich druck mir eure beträge jetzt mal aus und diskutiert das heute abend mit
    nem freund von mir, dann versuchen wir mal eine musterlösung zu erstellen.

    werd das dann morgen mal posten



  • Musterlösung 😉

    class CPackage : public CObject
    {
    public:
    DECLARE_SERIAL;  // Dynamisch erstellbar und Daten können per Serialize serialisiert werden
    virtual void Serialize( CArchive& ar);
    CString m_str1, m_str2;
    int i;
    float j;
    };
    
    IMPLEMENT_SERIAL( CPackage, CObject)  // RuntimeClass-Erstellung u.s.w. überlassen wir der MFC
    CPackage::Serialize(...)
    {
      if( ar.IsStoring())
      {
        ar << m_str1 << m_str2 << i << j;
      }
      else
      {
        ar >> m_str1 >> m_str2 >> i >> j;
      }
    }
    
    void CMySocket::Send()
    {
      CSocketFile file( this);
      {
        CArchive ar( &file, CArchive::store);
        ar << package;
      }  // sichergehen, dass ar vor file geschlossen wird
    }
    
    void CMySocket::Receive()
    {
      CSocketFile file( this);
      CArchive ar( &file, CArchive::load);
      {
        CPackage *package;
        ar >> package;  // Erstellung und mit Daten füllen, und alles 'automatisch'
      }  // sichergehen, dass ar vor file geschlossen wird
    }
    

    [ Dieser Beitrag wurde am 17.03.2003 um 17:27 Uhr von RenéG editiert. ]



  • warum verwendest du keine datenkapselung ??du hast die variablen alle als public in deiner class deklariert, das nenne ich nicht musterlösung, *g*



  • Diese unregistrierten Krümelkacker wieder 😉



  • ^^ stimmt



  • das sieht ja nett aus !

    schickes beispiel ... werd ich gleich mal ausprobieren.

    Hast du zufällig noch parat, wie man einen rohen byte puffer mit bekannter länge mit CArchive streamen kann ?? Muss ich mir das sowas schreiben, wie CRawBytes und da Serialize überladen etc. ? oder kann CByteArray (aus mfc) das schon von haus aus?

    grüsse



  • Stell Dir vor, was in der MSDN steht, wenn man sie liest:

    CByteArray incorporates the IMPLEMENT_SERIAL macro to support serialization and dumping of its elements. If an array of bytes is stored to an archive, either with the overloaded insertion (<< ) operator or with the Serialize member function, each element is, in turn, serialized.



  • könnte man auf diese art und weise jetzt auch in die klasse ein CFile mit übernehemen und so dateien übertragen?

    like icq



  • könnte man?

    Man kann fast alles!



  • wäre es auch möglich mit diesem socket mit einem unix/linux socket zu kommunizieren?



  • Bitte denke vorher kurz nach, bevor Du solche Fragen stellst!

    Läuft MFC auf Linux?



  • nein natürlich nicht 😉
    das war mir schon klar, ich meinte eher wenn ich einen socket auf linux schreibe (mit c zb) könnte dieser dann ach mit meinem CAsyncSocket in verbindung treten?

    ps:
    sorry wenn ich soviele fragen stelle, aber ich kenne keinen der mir hier antwortetn geben könnte und im inet ist darüber leider auch nichts zu finden.



  • mehr oder weniger schon.



  • Original erstellt von RenéG:
    **Stell Dir vor, was in der MSDN steht, wenn man sie liest:
    **

    jaja, augen auf beim eierkauf ... sorry, hab ich übersehn.

    Und solange die protokolle gleich sind, sollten sich sockets auf verschiedenen plattformen verstehen.

    grüsse



  • Soweit, wie ich das mitbekommen habe müssen die Objekte, die man verschickt, serialisierbar sein ergo, über den >>-Operator verfügen.
    CRecordset hat das meines Wissens nicht. Könnte ich also nicht verschicken. dann müsste ich wohl von CRecordset ableiten und selber serialisieren.
    Besteht da ne Chance??????? 🙄 🙄



  • Ach ja, das sollte echt in die FAQ, wenn es dann mal ausdiskutiert ist



  • Wie sollte bitteschön ein CRecordSet verschickt werden?
    1. Nur die Daten, womit es sich nachhaltig nicht mehr um ein RecordSet handelt
    2. Inklusive Datenbankanbindung, was aber sehr komplex wird, weil Du ja gar nicht weisst, ob auf die Datenbank auch von dem PC, wo das RecordSet hin geschickt wird, zugreifen kannst


Anmelden zum Antworten