L'envoi de données brutes avec write() dans boost::asio
J'ai récemment décidé d'utiliser boost::asio
pour mes prises, mais maintenant, je suis confronté à un problème: la documentation semble être en manque.
Ce que je veux faire est d'écrire une fonction qui va envoyer un message composé de la structure suivante:
- 2 octets d'un entier non signé (
uint16_t
) pour un opcode tous les octets - tous les octets de la suite (un flexible montant) être n'importe quel type de données (cast à
void*
). Ces données seront exploitées sur la base de l'opcode
Par exemple, si l'opcode est 1, peut-être définie comme OPCODE_LOGIN, alors les octets suivants l'opcode peut contenir une chaîne de caractères contenant les informations de connexion, etc.
bool sendMessage(tcp::socket* sock, uint16_t opcode, void* data)
{
void* fullData = malloc(sizeof(uint16_t) + sizeof(data));
memcpy(fullData, (void*)opcode, sizeof(opcode));
memcpy(&fullData + sizeof(uint16_t), data, sizeof(data));
boost::asio::write(sock, boost::asio::buffer(fullData, sizeof(fullData)));
//by the way, at this point, is it safe to delete fullData to prevent memory leaks?
return true;
}
Cela ne compile pas, cependant. Je reçois un cryptique erreur de compilation concernant l'appel à écriture:
1>------ Build started: Project: client, Configuration: Debug Win32 ------
1> main.cpp
1>c:\boost\boost_1_47\boost\asio\impl\write.hpp(46): error C2228: left of '.write_some' must have class/struct/union
1> type is 'boost::asio::basic_stream_socket<Protocol> '
1> with
1> [
1> Protocol=boost::asio::ip::tcp
1> ]
1> did you intend to use '->' instead?
1> c:\boost\boost_1_47\boost\asio\impl\write.hpp(59) : see reference to function template instantiation 'size_t boost::asio::write<SyncWriteStream,ConstBufferSequence,boost::asio::detail::transfer_all_t>(SyncWriteStream &,const ConstBufferSequence &,CompletionCondition,boost::system::error_code &)' being compiled
1> with
1> [
1> SyncWriteStream=boost::asio::ip::tcp::socket *,
1> ConstBufferSequence=boost::asio::mutable_buffers_1,
1> CompletionCondition=boost::asio::detail::transfer_all_t
1> ]
1> c:\users\josh\documents\visual studio 2010\projects\client\client\main.cpp(53) : see reference to function template instantiation 'size_t boost::asio::write<boost::asio::ip::tcp::socket*,boost::asio::mutable_buffers_ 1>(SyncWriteStream &,const ConstBufferSequence &)' being compiled
1> with
1> [
1> SyncWriteStream=boost::asio::ip::tcp::socket *,
1> ConstBufferSequence=boost::asio::mutable_buffers_1
1> ]
========== Build: 0 succeeded, 1 failed, 0 up-to-date, 0 skipped ==========
Comme vous pouvez le voir, le message d'erreur de points directement dans de Boost write.hpp
fichier, et de ne pas tout de mon propre code.. je crois que je vais appeler write()
de manière incorrecte, d'une certaine façon, mais après une bonne heure de recherche sur google et la recherche de références et des exemples (qui, soit utiliser un autre surchargé write()
ou l'utilisation des données, plus précisément définie tailles/structures), je n'ai pas été en mesure de déterminer exactement ce que je fais mal ici.
Quelqu'un peut-il m'aider à corriger de cette erreur de compilation?
OriginalL'auteur Josh1billion | 2011-10-16
Vous devez vous connecter pour publier un commentaire.
La plus voté question dans boost:: asio est à propos de la documentation, de commencer par là 🙂
La
write()
fonction libre attend un type de référence en tant que premier paramètre. Pas un pointeur que vous avez dans votre exempleOui,
write() is
un appel bloquant. Il est fait avec votre tampon lors de l'appel retourne. Je suggère fortement de faire ce code d'exception sûr cependant, regarde dans l'aide denew
et unboost::scoped_array
si vous souhaitez créer votre tampon de la dynamique de la durée de stockage.OriginalL'auteur Sam Miller