C ++从Socket读取到std :: string

时间:2014-01-22 02:22:47

标签: c++ sockets stdstring

我正在编写一个使用c套接字的c ++程序。我需要一个函数来接收我想要返回字符串的数据。我知道这不起作用:

std::string Communication::recv(int bytes) {
    std::string output;
    if (read(this->sock, output, bytes)<0) {
        std::cerr << "Failed to read data from socket.\n";
    }
    return output;
}

因为read() *函数为参数采用char数组指针。在这里返回字符串的最佳方法是什么?我知道理论上我可以将数据读入char数组然后将其转换为字符串,但这对我来说似乎很浪费。还有更好的方法吗?

*如果有更合适的选择

,我实际上并不介意使用read()以外的其他内容

以下是pastebin上应该在一周内过期的所有代码。如果到那时我没有答案,我会重新发布:http://pastebin.com/HkTDzmSt

[UPDATE]

我也尝试使用&output[0]但输出包含以下内容:

jello!
[insert a billion bell characters here]

“果冻!”是将数据发送回套接字。

1 个答案:

答案 0 :(得分:4)

以下是一些可以帮助您完成所需工作的功能。它假设你只从套接字的另一端接收ascii字符。

std::string Communication::recv(int bytes) {
    std::string output(bytes, 0);
    if (read(this->sock, &output[0], bytes-1)<0) {
        std::cerr << "Failed to read data from socket.\n";
    }
    return output;
}

std::string Communication::recv(int bytes) {
    std::string output;
    output.resize(bytes);

    int bytes_received = read(this->sock, &output[0], bytes-1);
    if (bytes_received<0) {
        std::cerr << "Failed to read data from socket.\n";
        return "";
    }

    output[bytes_received] = 0;
    return output;
}

打印字符串时,请务必使用cout << output.c_str(),因为字符串会覆盖operator<<并跳过不可打印的字符,直到达到大小。最终,您还可以在功能结束时调整大小,以便能够使用普通cout

正如评论中所指出的,首先发送大小也是一个好主意,以避免字符串类可能不必要的内存分配。