L'envoi et la réception de std::string sur socket
J'ai vu la même question sur la manière, mais non des réponses à ma question.
Ici, je suis en train d'envoyer et recv chaîne:
Je suis l'envoi de std::string :
if( (bytecount=send(hsock, input_string.c_str(), input_string.length(),0))== -1)
Peut-il être correctement reçu par cela?
if ((bytecount = recv(*csock, rcv.c_str(), rcv.length(), 0)) == -1)
J'obtiens l'erreur:
erreur: invalid conversion from ‘const void*’ to ‘void*’ [-fpermissive] " sur recv ligne!
J'ai fait un answer qui pourrait vous aider. Il démontre l'envoi de longueur arbitraire de données string par l'envoi de la longueur réelle (il suffit de les ignorer l'protobuf genre de trucs).
merci beaucoup! qu'est-ce que
Je n'ai pas eu le temps plus tôt aujourd'hui d'adapter la réponse à votre cas. Jetez un oeil s'il vous plaît.
merci beaucoup! qu'est-ce que
star pkt;
que ça va marcher pour std::string? Si vous pouvez écrire le morceau de code que j'ai wouuld reconnaissant. Sinon, je vais essayer moi-même.star pkt;
est une instance d'objet de l'un protobuf classe générée. Il est possible de/sérialisé à partir de/à std::string
objets. Ils sont utilisés pour send/recv sur le support, et ce qui doit démontrer vos besoins.Je n'ai pas eu le temps plus tôt aujourd'hui d'adapter la réponse à votre cas. Jetez un oeil s'il vous plaît.
OriginalL'auteur Catty | 2013-09-07
Vous devez vous connecter pour publier un commentaire.
Non, elle peut pas. c_str() renvoie une
const char*
. Cela signifie que vous ne pouvez pas écraser le contenu du pointeur.Si vous souhaitez recevoir les données, vous devez créer un tampon, par exemple, avec un
std::vector
et ensuite l'utiliser pour créer unstd::string
.Le code ci-dessus recevront 4096 octets à la fois. Si il n'y a plus de 4K envoyé, il va continuer boucle et ajouter les données à
recv
jusqu'à ce qu'il n'y a plus de données.Notez également l'utilisation de
&buffer[0]
au lieu debuffer.data()
. En prenant l'adresse du premier élément est la voie d'accès au non-const pointeur et d'éviter un comportement indéfini.length
dansstd::vector<char> buffer(length)
que je ne sais pas ce qu'est exactement la longueur de la réception des données est?Vous devez décider de la quantité maximale de données que vous souhaitez obtenir et de définir la longueur. Il n'existe aucun moyen pour vous de connaître la quantité de données que vous recevez effectivement. Si vous recevez moins de votre max taille de la mémoire tampon, vous avez tout le message, sinon vous devez appeler les recevoir à nouveau comme il y a plus de données sur la ligne.
Je fais affaire avec de grandes données venant de pages web. Je soupçonne que devrais-je l'utiliser! d'une autre manière?
pour obtenir plus de données, vous devez boucle et appel
recv
de nouveau. Mise à jour de réponse.// À ce stade, nous disposons de toutes les données. - Que signifie "toutes les données" signifie exactement? (C'est trop facile pour quelqu'un de l'erreur de croire que vous voulez dire un ensemble au niveau de l'application message, ce qui bien sûr serait totalement erroné.)
OriginalL'auteur Steve
Le meilleur moyen est d'envoyer la longueur de la chaîne abord les données dans un format fixe (par exemple, un
uint32_t
dans l'ordre des octets de réseau). Le récepteur peut lire ceci en premier et allouer un tampon de la taille appropriée avant de recevoir le message avec numéro de série qui est de l'envoyer par la suite.sd
etcsd
sont supposés être déjà présent socket descripteurs.Sender.cpp
Receiver.cpp
Avantage est. vous n'avez pas de déconner avec plusieurs tamponnée lit et copie du reçu de la chaîne. En outre, vous saurez à côté du récepteur lorsque les données envoyées est enfin au complet.
Inconvénient est, vous êtes en introduisant une sorte de "protocole" lors de l'envoi de la longueur de la première.
&rcvBuf[0]
.Qu'avez-vous fait qui a été si offensante pour conduire à une interdiction? Le site est la suppression de toute mention de votre nom comme un indésirable pharaon Égyptien. Voir aussi meta.stackoverflow.com/q/361337/608639 et meta.stackoverflow.com/q/361338/608639. Mon email est noloader, gmail compte.
OriginalL'auteur πάντα ῥεῖ
Non,
std::string::c_str()
retourneconst char*
qui signifie qu'il est en lecture seule. Vous pourrait allouer un tampon local et de créer des chaînes d'objet de mémoire tampon locale aprèsrecv
retourne avec succès.Vous devez dire à
recv
fonction pour lire une longueur spécifique de données, par exemple, vous voulez lire de 512 octets à chaque fois:Je veux une solution qui n'a pas de limite pour tampon limitée taille de la mémoire tampon!
Vous devez concevoir et mettre en œuvre un protocole (ou utiliser un protocole existant). Sinon, comment sera le destinataire de savoir combien d'octets à recevoir?
Oui, j'ai essayé de mettre en œuvre le protocole pour mon but. Mais je pense que Steve réponse à l'aneth avec n'importe quelle taille de données!
Steve réponse définit la longueur de 4096, il n'a pas affaire à n'importe quelle taille.
OriginalL'auteur billz
La numérotation dans cette question, que vous avez écrit (sans la
if
déclaration):rcv.c_str()
récupère unconst char*
pointeur. Leconst char*
a été contraint à laconst void*
. Le seul moyen que je connaisse pour obtenir des non-const pointeur et d'éviter un comportement indéfini est de prendre l'adresse du premier élément dans unestd::string
oustd::vector
:L'obtention de la non-const pointeur comme ça, c'est valable uniquement pour les conteneurs STL qui fournissent de mémoire contiguë. Le truc serait de ne pas travailler pour un
map
,multimap
ou d'autres conteneurs associatifs.@πάντα-ῥεῖ est la seule réponse qui a pris sur elle, mais il n'a pas à insister sur ce point.
OriginalL'auteur jww