Konvertierung von SOCKADDR in SOCKADDR_IN so richtig?
-
Hi,
wie der Titel schon sagt will ich eine SOCKADDR-Instanz in eine SOCKADDR_IN-Instanz umwandeln. Ich hab bisher nie mit memset & co. gearbeitet. Deshalb weis ich auch nicht ob das so richtig ist. Ich will ja auch nichts falsches im Speicher überschreiben.
SOCKADDR otherAdress; //bekommt irgendwann wert von accept() zugewiesen SOCKADDR_IN addr; //soll wert von otherAdress bekommen //irgendwann im quellcode ::memcpy(&addr, &otherAdress, sizeof(SOCKADDR));
-
die sind alle gleichgroß, ein simples cast ala SOCKADDR_IN s; (SOCKADDR)s; sollte es auch tun .... in der annahme das du das auf ein bind oder sowas anweden willst
-
Ich möchte eigentlich keinen C-Cast verwenden (dann doch lieber static-, dynamic- oder reinterpret_cast welche ja leider nicht funktionieren).
Ich brauche das ganze für eine eigene Address-Klasse
// kurzform class Address { public: SOCKADDR_IN* Get() { return &m_addr; }; bool operator = (SOCKADDR& otherAdress) { ::memcpy(&m_addr, &otherAdress, sizeof(SOCKADDR)); return true; //sinnlos, ich weis :) }; protected: SOCKADDR_IN m_addr; }Wenn ich später Daten von einem Socket empfange, dann kann ich so die Adresse des Clients in meine Klasse übernehmen.
Address ClientAddress; SOCKET sock; //create und bind überspringe ich mir mal SOCKADDR addr; int addressLenght = 0; listen(sock,1); SOCKET newSock = accept(sock, &addr, &addressLenght); ClientAddress = addr;
-
Wieso sollten die Casts nicht funktionieren? Für deine Zwecke ist reinterpret_cast genau der richtige Kandidat:
m_adr = * reinterpret_cast<SOCKADR_IN*>(&otherAdress);(übrigens sollte der op= lieber das zugewisene Objekt (*this) per Referenz zurückgeben - damit kannst du dann Zuweisungsketten ala
ad1=ad2=meine_adresse;verwenden)