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

Mik*_*ike 4 c++ unix sockets

对于我的应用程序,我需要能够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)