对于我的应用程序,我需要能够std::vector<std::string>通过UNIX套接字(本地)发送,并在套接字的另一端获取向量的副本.使用O(1)相对于向量大小的消息(即不向向量中的每个字符串发送消息),最简单的方法是什么?
由于这都在同一主机上,并且因为我控制套接字的两端,所以我不关心机器特定的问题,例如endinness或vector/string表示.
出于各种原因,我想避免使用任何外部库.
Dav*_*ith 12
std :: string不会阻止你在字符串中使用nuls.只有当您尝试将这些与非敏感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() );
}
...
Run Code Online (Sandbox Code Playgroud)
拆包也是类似的:
...
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 );
}
...
Run Code Online (Sandbox Code Playgroud)