CAsyncSocket -> Send/Receive
-
'Kennen'muss der Client die Klasse ja sowieso, sonst könntest Du ja nicht auf Members zurückgreifen.
Ich habe halt einen Schritt weiter gedacht. Das schöne hieran ist doch, dass jetzt der Bierkenner auch ohne Bierschild auf den Namen des Bieres schliessen kann und auch sofort feststellt, wenn etwas damit nicht stimmen sollte.
Und auf die 30 oder 40 Byte Datenoffset kommt's ja heutzutage nicht mehr an, oder?Weiterhin Codevergleich:
class CPackage { CString msg1, msg2, msg3 ...; }; // Code funzt CSocketFile file( this); { CArchive ar( &file); ar << package; } // folgender Code funzt nicht CPackage *package = new CPackage; package->msg1 = "hallo"; // msg1 ist eine von den 3 Stringvariablen size_t packsize = sizeof( *package ); // Fehler1 Send( package, packsize ); // Fehler2
-> Die Grössenberechnung und das Senden wird sehr viel komplizierter!
-
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