alte C++ Klasse für Netzwerkkommunikation in C# nachbauen



  • Hi erstmal,

    ich habe hier ein Client/Server Programm (Client und Server in C++), das dazu dient, auf einem Win CE5 Gerät diverse Tests durchzufühen. Die Kommunikation läuft per WinSock2 über UDP.

    Client -> WinCE gerät
    Server -> lokaler Rechner

    Hierbei wurde der Client relativ "dumm" gehalten. Er erhält vom Server ein Datenpaket das diverse Enums enthällt und dieverse andere parameter.
    Er wertet die Parameter aus und startet dann vordefinierte Aktionen wie Copy oder Delete usw...
    Soweit alles super...

    Ich wollte jetzt gern die Serverapplikation die auf dem lokalen Rechner läuft neu schreiben da die jetzige sehr altbacken und unübersichtlich ist und würde dafür gern C# verwenden.

    Die Verbindung zum Gerät habe ich so realisiert

    Socket MySocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
                IPAddress ip = IPAddress.Parse("192.168.56.110"); //natürlich nur zum testen fix eingestellt
    
                try
                {
                    MySocket.Connect(ip, 31337);
                    //...
                }
                catch (System.Exception e)
                { 
                    //...
                }
    

    Die Verbindung funktioniert auch nur leider weiss ich nicht so recht wie ich das Datenformat der alten Pakete die bis jetzt gesendet wurden in C# realisieren soll bzw würde ich am liebsten den bereits vorhandenen Code aus den C++ Dateien nutzen ( was aber warscheinlich nicht gehen wird). Ich habe versucht die C++ Klasse in C# nach zu bauen und zu serialisieren. Hatte da etwas gegogelt und was mit "Marshal" gefunden.
    Hab das was ich da gefunden hatte eingefügt und etwas für mich angepasst und es auch hin bekommen mein Objekt der Klasse in ein byte-array zu stopfen.
    Der Client kann mit dem empfangenen Daten nur rein gar nix anfangen. ( Ich habs debugged) Ich denke mal C# wird das ganze intern komplett anders ablegen.

    Hier erstmal die Definition eines Datenobjektes was ich an den Client senden möchte wie es aktuell in C++ ist.

    //Objekt dient als Vaterklasse für weitere Objekte
    class BaseFrame
    {
    public:
    	//Member
    	DWORD	m_SequenceNumber;
    	eOrder	m_eCommand;
    	eTransferFrameType m_eFrameType;
    
    	//c'tor / d'tor
    	BaseFrame();
    	BaseFrame(const BaseFrame& copy);
    	BaseFrame& operator= ( const BaseFrame& copy);
    	~BaseFrame();
    
    	//Methods
    	virtual bool Serialize(BYTE * pBuffer, DWORD iLength);
    	virtual bool Deserialize(BYTE * pBuffer, DWORD iLength);
    	virtual int GetFrameSize ();
    };
    

    Die Serialize Methode sieht momentan wie folgt aus

    bool BaseFrame::Serialize(BYTE* pBuffer, DWORD dwLength)
    {
    	DWORD dwOwnLength = this->GetFrameSize();
    
    	if ( pBuffer != NULL && dwLength >= dwOwnLength)
    	{
    		memcpy(pBuffer,(void*)this,dwOwnLength);
    		return true;
    	}
    	else
    		return false;
    }
    

    Die Frage ist, wie Bastle ich in C# das Datenpaket und Serialisiere es in ein byte-array sodass der Client der den bytesumpf empfängt es auch interpretieren kann obwohl er eben auf die C++ Klasse casted.

    Hoffe ich konnt mein Problem einigermaßen verständlich rüber bringen.

    Cheers,
    Sascha



  • Mit memcpy einen non-POD Typ ins Memory zu kopieren ist eine schlechte Idee!
    (z.B. wegen der vtbl).

    Überhaupt verlässt Du dich auf das Memory Layout von C++ (und dem entsprechenden Kompiler / Platform). Das scheint mir nicht sehr portabel.

    Simon

    Edit
    Ich würde Dir empfehlen, ein Format zu defineren (für Strings z.B. die Länge und die Daten, für Longs 4 Bytes, etc.), und das dann in C# und C++ abzubilden.



  • Hi,

    also wenn ich dich richtig verstehe einen byte-puffer anlegen und die daten darin ablegen?

    Cheers,
    Sascha



  • Genau. Und zwar nach einem (selbst)bestimmten (Serialisierungs)Schema.
    Simon



  • Jo, klingt gut!

    Das werd ich sobald zeit ist versuchen.

    Vielen Dank,

    Sascha


Anmelden zum Antworten