2015-12-03 2 views
0

Я отправляю структуру над соединением ZeroMQ. Два поля верны, но один из них поврежден. Чтобы проиллюстрировать эту проблему, мой код пытается прочитать содержимое сообщения zmq и создать новую структуру.ZeroMQ Message Corrupts Data

Выход:

$ ./client 
id = 100 
successful = 1 
data_size = 356515840 
Segmentation fault 

client.cc

#include <string> 
#include <iostream> 
#include "zmq.hpp" 
#include "struct.h" 

int main() { 
    zmq::context_t context (1); 
    zmq::socket_t socket (context, ZMQ_REQ); 
    socket.connect ("tcp://localhost:5555"); 

    query q(100); 
    q.data_size = 3; 
    q.data = "abc"; 
    q.successful = true; 
    zmq::message_t request = q.generate_message(); 
    query test_query((char *) request.data()); 
    return 0; 
} 

struct.h

#include <arpa/inet.h> 
#include "zmq.hpp" 

struct query { 
    long id; 
    bool successful; 
    long data_size; 
    std::string data; 

    query (long id) { 
    this->id = id; 
    this->successful = false; 
    this->data_size = 0; 
    this->data = ""; 
    } 

    query (char *start) { 
    id = *((long*) start); 
    start += sizeof(long); 

    std::cout << "id = " << id << std::endl; 

    successful = *((bool*) start); 
    start += sizeof(bool); 

    std::cout << "successful = " << successful << std::endl; 

    data_size = *((long *) start); 
    data_size = ntohl(data_size); 
    start += sizeof(long); 

    std::cout << "data_size = " << data_size << std::endl; 

    data = std::string(start, data_size); 
    } 

    long get_total_size() { 
    return 2 * sizeof(long) + sizeof(bool) + data_size; 
    } 

    // The string is encoded by calling data.c_str() 
    zmq::message_t generate_message() { 
    long size = get_total_size(); 
    zmq::message_t msg(size); 
    memcpy((void *) msg.data(), this, size); 
    char *loc_of_data = (char *) msg.data() + 2 * sizeof(long) + sizeof(bool); 
    memcpy((void *) loc_of_data, data.c_str(), data_size); 
    return msg; 
    } 
}; 

ответ

2

Вы игнорируя отступы.

Поскольку вы используете memcpy, вы помещаете ту же компоновку в сообщение, что и в вашей структуре, в вашей структуре. И long, bool, long в конструкции имеет отступы для выравнивания.

Я предлагаю подструктуру для ваших «простых старых данных» и перестаю думать о 2 * sizeof(long) + sizeof (bool).

+0

Awesome. Благодаря! –

Смежные вопросы