c++ 我如何将recv answer捕获到函数中?

sy5wg1nm  于 2023-10-20  发布在  其他
关注(0)|答案(1)|浏览(113)

我想构建一个函数,其中我传递一个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;
}
bgibtngc

bgibtngc1#

recv想要写入您提供的缓冲区。
char *recived_buffer;不是缓冲区,它只是一个指针。此外,std::vector<char> recived_buffer;只是一个空向量,没有空间让recv写入(暂且不谈你无论如何不能将向量传递给函数)。
您需要提供大小为len的缓冲区。你可以通过将向量转换为DEFAULT_BUFLEN,然后将指向向量数据的指针传递给函数(data())来实现。
你也不应该忽略返回值。它告诉你实际上已经读取了多少字节,并通过-1返回值报告错误。收到字节后,您可能希望将向量的大小调整为实际读取的字节数。我不打算讨论错误处理,因为我认为这超出了你的具体问题的范围。
一旦你有了包含数据的向量,从函数返回它就不再是问题了。对于实际工作的例子,我建议你参考文献。我可以在这里张贴的玩具例子太简单了,只会误导你。

相关问题