我正在编写一个使用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]
“果冻!”是将数据发送回套接字。
答案 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
。
正如评论中所指出的,首先发送大小也是一个好主意,以避免字符串类可能不必要的内存分配。