Short answer yes, it’s related to different languages. TCP and ZeroMQ only
deal with transport and framing of messages (respectively) Python has no
idea that that 10 bytes corresponds to a C/C++ struct of a given layout
until you tell it. Different platforms (CPU architectures) have potentially
different representations of fundamental types.

On Thu, Jan 25, 2018 at 4:37 PM Bernardo Augusto García Loaiza <
[email protected]> wrote:

> One more question. Why is necessary the serialization process? It is
> assumed that zeromq works via TCP and in the TCP protocol, the data does
> not undergo any transformation? This is related with the fact of that I
> have different platform/languages?
>
> On Thu, Jan 25, 2018 at 4:45 PM Bernardo Augusto García Loaiza <
> [email protected]> wrote:
>
>> Hi Thomas,
>> Thanks for your illustrative response
>>
>> I'll look Google Protocol Buffers. My sender is from C++ language and my
>> reception is Python. What sort of installation recommend me you? Binaries
>> or build protocol buffer along my C++ runtime? or o build protoc binary
>> from source?
>>
>> On Wed, Jan 24, 2018 at 8:36 PM Thomas Rodgers <[email protected]>
>> wrote:
>>
>>> You can have a look at Python’s ctypes module, which will let you define
>>> a ‘struct’ from Python with the same layout as your C++ struct.
>>>
>>> You can also investigate any number of serialization libraries that have
>>> C++ and Python support, eg ProtoBufs or Thrift, or MagPack or whatever.
>>>
>>> On Wed, Jan 24, 2018 at 5:26 PM Bernardo Augusto García Loaiza <
>>> [email protected]> wrote:
>>>
>>>> Hi, ZMQ people.
>>>> Greetings.
>>>>
>>>>
>>>> I have a  C++ zeromq client process in which I am sending some data
>>>> members structures
>>>>
>>>> *ZMQComponent.h* file
>>>>
>>>>
>>>> #include <zmq.hpp>
>>>> #include <sofa/defaulttype/VecTypes.h>
>>>>
>>>> // To Quat datatype
>>>> #include <sofa/defaulttype/Quat.h>
>>>> using sofa::defaulttype::Quat;
>>>>
>>>> using std::string;
>>>>
>>>> namespace sofa
>>>> {
>>>>
>>>> namespace component
>>>> {
>>>>
>>>> namespace controller
>>>> {
>>>>
>>>> /* data structure which I want send data to python zmq server */
>>>> struct instrumentData
>>>> {
>>>> typedef sofa::defaulttype::Vec3d Vec3d;
>>>> Vec3d pos;
>>>> Quat quat;
>>>> int btnState;
>>>> float openInst;
>>>> bool blnDataReady;
>>>> };
>>>>
>>>> class ZMQComponent : public sofa::core::behavior::BaseController
>>>> {
>>>> public:
>>>> SOFA_CLASS(ZMQComponent, sofa::core::behavior::BaseController);
>>>>
>>>> ZMQComponent();
>>>> virtual ~ZMQComponent();
>>>> /* Conect to ZMQ external python Server */
>>>> void setupConnection();
>>>>
>>>> /* Send some data memeber instrumentData structure to ZMQ external
>>>> Server */
>>>> void instrumentDataSend(instrumentData a);
>>>>
>>>> /* initialize function */
>>>> void init();
>>>>
>>>> };
>>>>
>>>> } // namespace sofa
>>>>
>>>> } // namespace component
>>>>
>>>> } // namespace controller
>>>>
>>>>
>>>> The *ZMQComponent.cpp* is:
>>>>
>>>> #include <sofa/core/ObjectFactory.h>
>>>> #include <zmq.hpp>
>>>> #include <iostream>
>>>> #include <string>
>>>> #include "ZMQComponent.h"
>>>>
>>>>
>>>> using namespace std;
>>>>
>>>> namespace sofa
>>>> {
>>>>
>>>> namespace component
>>>> {
>>>>
>>>> namespace controller
>>>> {
>>>>
>>>> /* ZMQ Internal Client context and socket */
>>>> zmq::context_t context(1);
>>>> zmq::socket_t socket(context, ZMQ_REQ);
>>>>
>>>> ZMQComponent::ZMQComponent(){}
>>>>
>>>> void ZMQComponent::setupConnection()
>>>> {
>>>> cout << "Connecting to python zeroMQ server ..." << endl;
>>>> socket.connect("tcp://localhost:5555");
>>>> }
>>>>
>>>> void ZMQComponent::instrumentDataSend(instrumentData a)
>>>> {
>>>> /* Initialize the data members structure instrumentData */
>>>> a.pos = sofa::defaulttype::Vec3d(1.0f, 1.0f, 1.0f);
>>>> a.quat = defaulttype::Quat(1.0f, 1.0f, 4.0f, 1.0f);
>>>> a.btnState = 5671;
>>>> a.openInst = 1.0f;
>>>> a.blnDataReady = false;
>>>>
>>>> /* We send the btnState data */
>>>> zmq::message_t request(10);
>>>> cout << "The data are: " << a.btnState;
>>>>
>>>> /* We ask for the memory address to ge the btnState content and send
>>>> it. */
>>>> memcpy(request.data(), &a.btnState, 10);
>>>> socket.send(request);
>>>> }
>>>>
>>>>
>>>> /* In the init function we create the objects to setup connection and
>>>> send data */
>>>> void ZMQComponent::init()
>>>> {
>>>> std::cout << "ZeroMQCommunication::init()" << std::endl;
>>>> ZMQComponent z;
>>>> z.setupConnection();
>>>>
>>>> instrumentData itemp;
>>>> z.instrumentDataSend(itemp);
>>>> }
>>>>
>>>> /* Other code related .... */
>>>> ZMQComponent::~ZMQComponent(){}
>>>>
>>>> // int ZeroMqComponentClass = sofa::core::RegisterObject("This
>>>> component does nothing.").add<ZeroMqComponent>();
>>>> SOFA_DECL_CLASS(ZMQServerComponent)
>>>>
>>>> int ZMQServerComponentClass = sofa::core::RegisterObject("This
>>>> component create a Socket.").add< ZMQServerComponent >();
>>>> } // namespace controller
>>>>
>>>> } // namespace component
>>>>
>>>> } // namespace sofa
>>>>
>>>> Then , my python zmq server  which receive the *btnState*  int
>>>> variable is:
>>>>
>>>> import time
>>>> import zmq
>>>>
>>>> context = zmq.Context()
>>>> socket = context.socket(zmq.REP)
>>>> socket.bind("tcp://*:5555")
>>>> print('ZMQ Server listening ... ')
>>>>
>>>> while True:
>>>> # Wait for next request from client
>>>> message = socket.recv()
>>>> print("Received message from Sofa: {}".format(message))
>>>> # print("Received message from c++ %s" % message)
>>>>
>>>> # Do some 'work'
>>>> time.sleep(1)
>>>>
>>>> # Send reply back to client
>>>> # socket.send(b"Hola cliente, muy bien y tu ?")
>>>> # print('Response sent')
>>>>
>>>>
>>>>
>>>> The output or the message which arrive to python zmq server is the
>>>> symbols characters of the btnState:
>>>>
>>>> (cnvss_test) ➜  Python git:(ZMQCommunication) ✗ python server.py
>>>> ZMQ Server listening ...
>>>> *Received message from Sofa: b"\x00'\x84)\xff\x7f\x00\x00\x98&*"
>>>>
>>>> Likely, As I in my python server I am representing like  a string
>>>> message arrived and I am sending from my c++ client a int btnState
>>>> data,
>>>> then I try convert int to string in  the python server side:
>>>>
>>>> And I replace this line
>>>>
>>>> print("Received message from Sofa: {}".format(message))
>>>>
>>>> by thiis line
>>>>
>>>> print("Received message from c++ %s" % str(message))
>>>>
>>>> But my output is:
>>>>
>>>> (cnvss_test) ➜  Python git:(ZMQCommunication) ✗ python server.py
>>>> ZMQ Server listening ...
>>>> *Received message from c++ b'\x00^n&\xff\x7f\x00\x00\xd8\\'*
>>>> Traceback (most recent call last):
>>>>   File "server.py", line 19, in <module>
>>>>     message = socket.recv()
>>>>   File "zmq/backend/cython/socket.pyx", line 693, in
>>>> zmq.backend.cython.socket.Socket.recv
>>>>   File "zmq/backend/cython/socket.pyx", line 727, in
>>>> zmq.backend.cython.socket.Socket.recv
>>>>   File "zmq/backend/cython/socket.pyx", line 150, in
>>>> zmq.backend.cython.socket._recv_copy
>>>>   File "zmq/backend/cython/socket.pyx", line 145, in
>>>> zmq.backend.cython.socket._recv_copy
>>>>   File "zmq/backend/cython/checkrc.pxd", line 25, in
>>>> zmq.backend.cython.checkrc._check_rc
>>>> zmq.error.ZMQError: Operation cannot be accomplished in current state
>>>> (cnvss_test) ➜  Python git:(ZMQCommunication) ✗
>>>>
>>>> I follow getting the characters symbolss.
>>>> My question is: How to can I represent the arrived message in my python
>>>> zmq server to show their content ?
>>>> According to this behavior, can I assume that the btnState data is sent
>>>> to python server of anyway?
>>>>
>>>> Any support or orientation will be highly appreciated
>>>>
>>>>
>>>>
>>>>
>>>> _______________________________________________
>>>> zeromq-dev mailing list
>>>> [email protected]
>>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>>>
>>> _______________________________________________
>>> zeromq-dev mailing list
>>> [email protected]
>>> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>>>
>> _______________________________________________
> zeromq-dev mailing list
> [email protected]
> https://lists.zeromq.org/mailman/listinfo/zeromq-dev
>
_______________________________________________
zeromq-dev mailing list
[email protected]
https://lists.zeromq.org/mailman/listinfo/zeromq-dev

Reply via email to