gpt4 book ai didi

C++ 从套接字读取到 std::string

转载 作者:可可西里 更新时间:2023-11-01 18:37:48 25 4
gpt4 key购买 nike

我正在用 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

[更新]

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

jello!
[insert a billion bell characters here]

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

最佳答案

这里有一些函数可以帮助您完成您想要的。它假定您只会从套接字的另一端接收 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。 .

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

关于C++ 从套接字读取到 std::string,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21272997/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com