char array to struct



  • Hallo,

    ich habe folgende Struktur:

    struct Konfigurationsdaten
    {
    	bool   Initialisierungsstatus;
    	string Mail_Server;
    	string Mail_Account;
    	string Mail_Passwort;
    	int	   TimeOut;
    	vector<string> Mail_Adressen;
    }
    

    Aus folgender Funktion(Win Sockets) bekomme ich aber nur einen char Array:

    Konfigurationsdaten Daten;
    char temp[sizeof(Daten)];
    recv(client, temp, sizeof(temp), 0);
    

    Weiß jemand wie ich das casten kann?



  • Einfach mit assign oder so reinkopieren (oder operator= nutzen)?



  • secondsun schrieb:

    Hallo,

    ich habe folgende Struktur:

    struct Konfigurationsdaten
    {
    	bool   Initialisierungsstatus;
    	string Mail_Server;
    	string Mail_Account;
    	string Mail_Passwort;
    	int	   TimeOut;
    	vector<string> Mail_Adressen;
    }
    

    Aus folgender Funktion(Win Sockets) bekomme ich aber nur einen char Array:

    Konfigurationsdaten Daten;
    char temp[sizeof(Daten)];
    recv(client, temp, sizeof(temp), 0);
    

    Weiß jemand wie ich das casten kann?

    Leider garnicht. 😞
    Die C++ Objekte vom Typ string und vector<string> haben ihren Speicher "irgendwo" und nicht in der Struktur (es sind keine PODs).
    Du müßtest die Struktur serialisieren (flach machen) damit send() und recv() sie verarbeiten können.



  • Konfigurationsdaten Daten;
    recv(client, (char*)&Daten, sizeof(Daten), 0);
    

    Würde mich schwer wundern, wenn das nicht geht. recv will einfach nur einen Pointer auf eine Speicherstelle, wo sie die ankommenden Daten hinpackt.

    EDIT:
    Das Problem, dass du Klassen verwendest, deren Speicher irgendwo aufm Heap liegt, ist natürlich eine ganz andere Baustelle.

    Du musst wie bereits angesprochen wurde die Adressen irgendwie serialisieren. Entweder du kopierst die struct und die Adressen hintereinander oder du schickst die Daten getrennt. Serialisieren sollte einfach sein:

    class MailAddressTable
    {
    private:
    	char*  m_mem;
    	size_t m_pos;
    
    public:
    	MailAddressTable(unsigned MemSize) : m_mem(new char[MemSize]()), m_pos(1), m_size(MemSize) {}
    
    	virtual ~MailAddressTable() {
    		delete[] m_mem;
    	}
    
    	char* get() const {
    		return m_mem;
    	}
    
    	void add(char* mail, size_t len) 
    	{
    		memcpy(m_mem + m_pos, mail, len);
    		(*m_mem)++;
    		m_pos += len;
    	}
    
    	const size_t m_size;
    };
    
    int main()
    {
    	char* MailAddress [] = 
    	{
    		"addr1@world.com",
    		"addr2@world.com",
    		"addr3@world.com"
    	};
    
    	MailAddressTable* mat = new MailAddressTable(strlen(MailAddress[0]) * 3 + 2);
    
    	for( int i = 0; i < 3; i++ )
    		mat->add(MailAddress[i], strlen(MailAddress[i]));
    
    	char* byte_reader = mat->get();
    
    	cout << "AddressCount: " << (unsigned)*byte_reader++ << endl;
    	cout << byte_reader << endl;
    
    	delete mat;
    	return 0;
    }
    


  • Mein Gott...So viele Informationen:-) Super..
    Also ich dachte, was die Serialisierung angeht, zuerst an boost. Wollte mich da eh noch ein wenig einarbeiten. Nur wenn es jetzt auf die schnelle auch anders geht wäre das auch nicht schlecht. Ich werde mal versuchen, die Sachen umzusetzen und anschließend gebe ich ein Feedback;-)



  • Serialisieren heißt nur, dass du die Daten zum versenden als einen Datenblock brauchst. Wie du dass machst ist dein Bier. Du kannst zum versenden auch deine Struct und die Mail-Adressen zusammen kopieren.

    Du musst auf Empfängerseite nur wissen, wie du's wieder auseinader bekommst 😉



  • So, da bin ich wieder...
    Also ich habe es jetzt fast gelöst.
    Die C# DLL schickt serialisiert Daten zum Dienst, die dort mit recv empfangen werden. Wollte das dann dort casten. Das hätte aber eh nicht funktioniert, da ich einen .NET BinaryFormatter benutzt habe.
    In diesem Fall würde ich dann ein Pakter bekommen, was nicht nur meine eigentlichen Daten enthält sondern auch Felder wie "Culture" usw. mit denen ich natürlich nichts anfangen kann.
    Also habe ich in der .NET Schnittstelle einen XML Formatter implementiert, der quasi einen XML String zum Dienst schickt und das nehme ich dann dort auseinander.

    Wer übrigens eine gute Lösung im Umgang mit XML kennt, lässt es mich bitte wissen;-)


Anmelden zum Antworten