对于我的申请,我需要能够发送 std::vector<std::string>
通过 UNIX 套接字(本地),并在套接字的另一端获取 vector 的拷贝。使用 O(1)
执行此操作的最简单方法是什么?相对于 vector 大小的消息(即不为 vector 中的每个字符串发送消息)?
因为这一切都在同一台主机上,并且因为我控制套接字的两端,所以我不关心特定于机器的问题,例如 endinness 或 vector/字符串表示。
出于各种原因,我想避免使用任何外部库。
最佳答案
std::string 不会阻止您在字符串中包含空值。只有当您尝试将这些与 nul 敏感 API 一起使用时,您才会遇到麻烦。我怀疑您会通过在数组的大小之前添加数组的大小然后在线路上每个字符串的长度来序列化数组。
...
long length = htonl( vec.size() );
write( socket, &length, sizeof(length) );
for ( int i = 0; i < vec.size(); ++i ) {
length = htonl( vec[i].length() );
write( socket, &length, sizeof(length) );
write( socket, vec[i].data(), vec[i].length() );
}
...
解包过程类似:
...
std::vector vectorRead;
long size = 0;
read( socket, &size, sizeof( size ) );
size = ntohl( size );
for ( int i = 0; i < size; ++i ) {
std::string stringRead;
long length = 0;
read( socket, &length, sizeof( length ) );
length = ntohl( length );
while ( 0 < length ) {
char buffer[1024];
int cread;
cread = read( socket, buffer, min( sizeof( buffer ), length ) );
stringRead.append( buffer, cread );
length -= cread;
}
vectorRead.push_back( stringRead );
}
...
关于c++ - 如何通过 UNIX 套接字发送 std::vector<std::string> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2657228/