通过共享内存使用Thrift进行IPC通信

问题描述:

我无法找到一个关于如何使用apache thrift通过共享内存进行ipc通信的示例。我的目标是在节俭的帮助下序列化一个存在的类,然后通过共享内存发送到另一个过程,在节俭的帮助下我再次反序列化它。现在我正在使用TMemoryBuffer和TBinaryProtocol来序列化数据。虽然这有效,但我不知道如何将它写入共享内存。通过共享内存使用Thrift进行IPC通信

这是到目前为止我的代码:

#include "test_types.h" 
#include "test_constants.h" 
#include "thrift/protocol/TBinaryProtocol.h" 
#include "thrift/transport/TBufferTransports.h" 

int main(int argc, char** argv) 
{ 
    int shID; 
    char* myPtr; 
    Person* dieter = new Person("Dieter", "Neuer"); 
    //Person* johann = new Person("Johann", "Liebert"); 
    //Car* ford = new Car("KLENW", 4, 4); 

    PersonThrift dieterThrift; 
    dieterThrift.nachName = dieter->getNachname(); 
    dieterThrift.vorName = dieter->getVorname(); 

    boost::shared_ptr<apache::thrift::transport::TMemoryBuffer> transport(new apache::thrift::transport::TMemoryBuffer); 
    boost::shared_ptr<apache::thrift::protocol::TBinaryProtocol> protocol(new apache::thrift::protocol::TBinaryProtocol(transport)); 

    test thriftTest; 
    thriftTest.personSet.insert(dieterThrift); 

    u_int32_t size = thriftTest.write(protocol.get()); 



    std::cout << transport.get()->getBufferAsString(); 

    shID = shmget(1000, 100, IPC_CREAT | 0666); 
    if (shID >= 0) 
    { 
     myPtr = (char*)shmat(shID, 0, 0); 

     if (myPtr==(char *)-1) 
     { 
      perror("shmat"); 
     } 
     else 
     { 
      //myPtr = protocol.get(); 
     } 
    } 
    getchar(); 
    shmdt(myPtr); 
} 

的主要问题是部分

//myPtr = protocol.get(); 

如何使用节俭,这样我可以写我的反序列化的数据到myPtr(并由此进入共享内存)。我想TMemoryBuffer可能已经不是个好主意了。正如你可能看到的,我对此并不是很有经验。

亲切的问候和感谢提前

迈克尔

的代码再次读取的问题,并有细看之后......你几乎没有。你犯的错误是看看协议,它没有给你任何数据。相反,你要问的运输,因为你已经有

std::cout << transport.get()->getBufferAsString(); 

,以获得原始数据的方式确实颇为相似,只是使用getBuffer(&pbuf, &sz);代替。利用这一点,我们得到这样的:

// query buffer pointer and data size 
uint8_t* pbuf; 
uint32_t sz; 
transport.get()->getBuffer(&pbuf, &sz); 

// alloc shmem blöock of adequate size 
shID = shmget(1000, sz, IPC_CREAT | 0666); 
if (shID >= 0) 
{ 
    myPtr = (char*)shmat(shID, 0, 0); 

    if (myPtr==(char *)-1) 
    { 
     perror("shmat"); 
    } 
    else 
    { 
     // copy serialized data into shared memory 
     memcpy(myPtr, pbuf, sz); 
    } 
} 

由于shmget的()可以给你一个更大的块比的要求,这似乎是另外使用陷害运输,能够自动进行真正的好主意数据大小在序列化数据中。后者的一些示例代码可以在Test Client or server code中找到。