c++ - 如何通过 UNIX 套接字发送 std::vector<std::string> ?

标签 c++ unix sockets

对于我的申请,我需要能够发送 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/

相关文章:

bash - 使用 unix 工具和多列排序

Django Socketio 101

perl - 仅当有完整行时,如何才能从 IO::Socket::INET 文件句柄中读取?

c# - 没有证书的 SslStream

c++ - 模板中 operator++ 上未解析的外部符号

c++ - 迭代器适配器仅迭代 map 中的值?

c++ - "X is not a member of Y"即使 X 是 Y 的 friend ?

mysql - 如何读取/转换包含\040 而不是空格的 mysql 历史记录 (.mysql_history)?

shell - 如何从 Shell 脚本的属性文件中获取变量值?

C++ - 按顺序打开文本文件