Передача сообщения Python ZMQ искажена

Мой сервер в Python:

import time
import zmq

context = zmq.Context()
socket  = context.socket( zmq.REP )
socket.bind( "tcp://*:5555" )

while True:
    #  Wait for next request from client
    message = socket.recv()
    print( "Received request: %s" % message )

    #  Do some 'work'
    time.sleep( 1 )

    #  Send reply back to client
    socket.send( b"World" )

Мой клиент C:

    std::string str = std::to_string(bar.open)   + ';'
                    + std::to_string(bar.high)   + ';'
                    + std::to_string(bar.low)    + ';'
                    + std::to_string(bar.close)  + ';'
                    + std::to_string(bar.volume) + ';'
                    + bar.time                   + ';'
                    + std::to_string(bar.hour)   + ';'
                    + std::to_string(bar.minute) + ';'
                    + bar.date                   + ';'
                    + bar.symbol;
    void *context   = zmq_ctx_new ();
    void *requester = zmq_socket ( context, ZMQ_REQ );
    zmq_connect ( requester, "tcp://localhost:5555" );

    char buffer [10];
    printf (  "Sending data to python module\n" );

    zmq_send ( requester, static_cast<void*>(&str), 1000, 0 );
    zmq_recv ( requester, buffer, 10, 0 );
    printf (  "Received %s\n", buffer );

    zmq_close ( requester );

Когда я отправляю сообщение от клиента C, данные, напечатанные на python, искажаются, например:

Received request: @c�SxH���C��
                           %�.075600;C�
                                       %�;C �
                                             %0.075600�C@�
                                                          %�`�
                                                              %���
                                                                  %���
                                                                      %0.075600%���
   %���
       %����C��

Как я могу декодировать сообщение в Python, чтобы распечатать правильно?

1 ответ

Решение

Код на стороне C отправляет только "1D" ряд простых байтов: char[]
в то время как

python3 думает в "2D", ожидая обоих: { bytes[], encoding }

это приводит к дезинтерпретации внутри "string{0:s}".format( message ) выполнение, так как мини-шаблон ожидает message быть действительно "полностью оборудованной" строкой python3, чего не может быть.

print( ":::{0:s}:::".format( str( message, 'utf-8' ) ) ) # ought fix the game

Другая идея состоит в том, чтобы представить некоторый проводной картограф (или лучше протокол)

чтобы явно контролировать обработку содержимого с отображением байтов.

В модуле QuantFX стороны в многопартийной распределенной обработке FX-engine / ML-предсказаний придерживаются спецификации протокола, используя struct.unpack() на стороне питона, один раз aMiniRESOPONDER() имеет .recv() -ed aMSG,

Вся проблема здесь сводится только к скоординированному управлению версиями протокола, поэтому любой целевой узел может адаптировать удаленно-распределенную обработку к соответствующей версии протокола на лету.

            pass;                     #aMSG_STRUCT_MASK = '!IIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIIII'
            pass;                      aMSG_STRUCT_MASK = "!" + "I" * ( v41_HeaderSIZE + ( v41_nBarsDEPTH * 7 ) )
            #----DATA------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            aMSG_DATA = struct.unpack( aMSG_STRUCT_MASK, aMSG )
            #----INT-------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
            #DSegINT  = np.asarray(    aMSG_DATA[             2:],              # SKIP HEADER: Open_0, CurrentPRICE
            aDSegINT  = np.asarray(    aMSG_DATA[v41_HeaderSIZE:],              # SKIP HEADER: Open_0, CurrentPRICE [v412: MQL4_Digits, MQL4_GetTickCountOnSEND ]
                                       order = 'F'                              # FORTRAN-column-major-aligned / caching / speed
                                       )
Другие вопросы по тегам