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