我最近遇到了一個問題,我有兩個獨立的行程需要共享兩個字串。(一個動態 IP 地址和一個密鑰)我習慣于為此使用 ROS,在這里我會用兩個字串定義一個 ROS msg 并將其從一個發送到另一個。
然而,我們正在努力使我們的應用程式盡可能簡單,從而盡可能避免使用第三方軟體。為此,我最初計劃使用共享記憶體來發送一個包含兩者的結構,std::string只是為了意識到這不是一個微不足道的問題,因為該結構的大小是動態的...
我也想過使用其他方法,比如套接字或佇列,但我總是遇到事先不知道這個結構體大小的問題。如何處理這個問題?有沒有一種方法可以做到不涉及定義一些協議,在該協議中您將字串的大小放在前面并以空值或類似的值結束?
這是我的代碼片段,它使用 Qt 創建一個 SharedMemory 來傳遞這個結構(當然沒有成功)。
struct
{
std::string ip_address;
std::string key;
}server_data_t;
#define SERVER_DATA_LEN sizeof(server_data_t)
class SharedMemoryManager : public QSharedMemory
{
...
QByteArray SharedMemoryManager::read()
{
QLOG_TRACE() << "SharedMemoryManager::read()";
QByteArray readData;
try
{
if(!isAttached())
throw std::runtime_error("Share memory segment has not been opened yet");
lock();
readData = QByteArray(static_cast<char *>(data()), size());
unlock();
return readData;
}
catch (std::exception &e)
{
QLOG_ERROR() << e.what();
return readData;
}
}
void SharedMemoryManager::write(const QByteArray &byte_array)
{
QLOG_TRACE() << "SharedMemoryManager::write()";
try
{
if(!isAttached())
throw std::runtime_error("Share memory segment has not been opened yet");
lock();
{
auto *from = byte_array.data();
char *to = static_cast<char*>(data());
memcpy(to, from, qMin(size(), byte_array.size()));
}
unlock();
}
catch (std::exception &e)
{
QLOG_ERROR() << e.what();
}
}
}
...
SharedMemoryManager _shm_manager;
server_data_t server_data;
server_data.ip_address = ...;
server_data.key = ...;
char *p = (char*)&server_data;
QByteArray byte_array = QByteArray(p, sizeof(server_data_t));
_shm_manager.write(byte_array);
...
SharedMemoryManager _shm_manager;
QByteArray byte_array = _shm_manager.read();
auto server_data = reinterpret_cast<server_data_t *>(byte_array.data());
std::cout << server_data->ip_address << std::endl;
當它嘗試訪問字串時失敗。
uj5u.com熱心網友回復:
共享記憶體應該沒問題(您甚至讓 Qt 完成所有艱苦的作業)您需要的可能是這樣的東西,在共享記憶體中具有固定大小的東西,并且仍然有足夠的空間來容納您的字串。
const std::size_t message_buf_size = 256;
struct data_t
{
char message[message_buf_size]; // copy string into this and terminate with 0
std::uint8_t ipv4[4];
}
請注意,字串的資料無論如何都會在堆上分配(除了它們被優化的小字串),而不是在共享記憶體中。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/345126.html
上一篇:Qt:在庫中注入定義
