2009-12-10 7 views
1

Je suis un client de C++. J'ai une question concernant l'initialisation d'un tampon de caractères dynamiquementInitialisation dynamique d'un tampon de char public

class Pkg { 
    public: 
    Header t; 
    char buf[LENGTH]; 
}; 

Je vais envoyer l'objet de la classe sur le réseau. classe d'en-tête est converti en ordre des octets du réseau

Alors, je veux envoyer comme ça

Pkg ackpkt; 

sendto(sd, &ackpkt, sizeof(ackpkt), 0,(struct sockaddr*)socket1,sizeof(struct sockaddr_in); 

Le champ de longueur ici devrait être dynamiquement assignée à chaque fois juste avant que j'appelle sendto. Une façon dont je pense à cela est de déclarer que LENGTH est global.

Du côté des récepteurs, je veux recevoir l'objet dans un objet du même class.ie les données de t d'objets devraient être organisés dans ackpktrecv.t et tampon dans ackpktrecv.buf

recvfrom (sd, & ackpktrecv, sizeof ackpktrecv, 0, (struct sockaddr *) & sockaddrs, & len);

Comment puis-je recevoir l'objet avec le tampon de caractères ayant la même longueur que LONGUEUR Quelqu'un peut-il me suggérer de quelle manière je peux y parvenir?

Répondre

1

Puisqu'il s'agit de C++, pensez à utiliser un vector<T> au lieu d'un caractère.

class Pkg { 
public: 
    Pkg(vector<char>::size_type size) :buf(size) { 
    } 

    vector<char> buf; 
}; 

qui vous permet d'envoyer des données de la manière suivante

Pkg ackpkt(someSize); 
sendto(
    sd, 
    &(ackpkt.buf[0]), 
    actpkt.buf.size(), 
    0, 
    (struct sockaddr*)socket1, 
    sizeof(struct sockaddr_in) 
+0

Oh, mais je veux recv l'objet sur le côté serveur. Alors cela fonctionnera, recvfrom (sd, et ackpkt, sizeof ackpkt, 0, (struct sockaddr *) & sockaddrs, &len); Je veux les données que j'ai envoyé dans un tampon de caractères à réorganiser dans la mémoire tampon de caractères à l'objet du côté récepteur –

+0

@CG recieving fonctionne correctement, mais vous aurez probablement besoin de le faire en morceaux, puis de combiner les paquets ensemble, ce qui est très facile avec un vecteur, car ils sont facilement concaténés – JaredPar

0

Je recommande un idiome RAII:

  • Faire le constructeur pkg prendre un paramètre length et allouent buf dans le constructeur avec new char[length].
  • Faire la destructor pour faire Emb delete[] buf

Puis chaque fois à travers la boucle, vous créez simplement un nouvel objet Pkg avec la longueur désirée.

+0

réorganiser le tampon de caractères avec la même longueur (comme lors de l'envoi) dans un objet de Pkg du côté des récepteurs? –

Questions connexes