我想构建一个函数,其中传递 socket 作为参数,它调用函数
recv
并返回其答案。
这就是我构建它的方式:
char *recive_buffer(SOCKET socket)
{
std::cout << "Reciving the buffer..." << std::endl;
int recvbuflen = 512;
char *recived_buffer;
recv(socket, recived_buffer, recvbuflen, 0);
return recived_buffer;
}
我希望它能够实现与
recv()
相同的功能,但只传递一个参数,即套接字。
但是当客户端向我的服务器发送消息时我无法得到任何答复。 我做错了什么?
顺便说一句,我正在开始学习C/C++,我可以改进这段代码逻辑和写作吗? 谢谢大家(;
====================================================== ======================= 编辑加
我正在构建大学的毕业作品,年初我选择了 C++,所以我必须继续前进。
我将代码修改为:
std::vector<char> recive(SOCKET socket)
{
std::cout << "Reciving message..." << std::endl;
std::vector<char> recived_buffer;
recv(socket, recived_buffer, DEFAULT_BUFLEN, 0);
return recived_buffer;
}
并收到错误:
error: no matching function for call to 'recv'
winsock2.h:992:34: note: candidate function not viable: no known conversion from 'std::vector<char>' to 'char *' for 2nd argument
我正在使用 QT Creator。
====================================================== ===================================== 编辑加
它工作了!
这就是我所做的:
std::string recive(SOCKET socket)
{
std::cout << "Reciving message..." << std::endl;
char recived_buffer[DEFAULT_BUFLEN];
recv(socket, recived_buffer, DEFAULT_BUFLEN, 0);
return recived_buffer;
}
recv
想要写入您提供的缓冲区。
char *recived_buffer;
不是缓冲区,它只是一个指针。另外 std::vector<char> recived_buffer;
只是一个空向量,没有空间供 recv
写入(暂时搁置,无论如何你都无法将向量传递给函数)。
您需要提供大小为
len
的缓冲区。您可以通过将向量大小调整为 DEFAULT_BUFLEN
,然后将指向向量数据的指针传递给函数 (data()
) 来完成此操作。
您也不应该忽略返回值。它告诉您实际读取了多少字节,并通过
-1
返回值报告错误。收到字节后,您可能需要将向量的大小调整为实际读取的字节数。我不会讨论错误处理,因为我认为它超出了您的具体问题的范围。
一旦获得带有数据的向量,从函数返回它就不再是问题了。对于实际工作示例,我建议您参考文献。我可以在此处发布的玩具示例过于简化,只会误导您。