我想构建一个函数,其中我传递一个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()
相同的函数,但只传递一个参数,socket。
但是当客户端向我的服务器发送消息时,我得不到任何答复。我做错了什么?
顺便说一句,我开始在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;
}
1条答案
按热度按时间bgibtngc1#
recv
想要写入您提供的缓冲区。char *recived_buffer;
不是缓冲区,它只是一个指针。此外,std::vector<char> recived_buffer;
只是一个空向量,没有空间让recv
写入(暂且不谈你无论如何不能将向量传递给函数)。您需要提供大小为
len
的缓冲区。你可以通过将向量转换为DEFAULT_BUFLEN
,然后将指向向量数据的指针传递给函数(data()
)来实现。你也不应该忽略返回值。它告诉你实际上已经读取了多少字节,并通过
-1
返回值报告错误。收到字节后,您可能希望将向量的大小调整为实际读取的字节数。我不打算讨论错误处理,因为我认为这超出了你的具体问题的范围。一旦你有了包含数据的向量,从函数返回它就不再是问题了。对于实际工作的例子,我建议你参考文献。我可以在这里张贴的玩具例子太简单了,只会误导你。