【发布时间】:2019-11-13 05:37:45
【问题描述】:
我正在使用 C++ 编写一个聊天程序。并陷入发送/接收文件的问题。我的服务器端是 Python,它在 Flask App 的后台运行,接受 TCP 连接并将传入/传出数据转发到聊天客户端。它没有问题并且效果很好。我的问题出在客户端接收上。我添加了发送和接收文件的这个功能。虽然发送正常且没有错误(经过测试并且可以正常工作)。在客户端接收让我很头疼。
我正在使用以下内容来接收文件,无论是二进制文件还是文本文件。
// filebuf is defined as
// char filebuf[BUFFER];
// BUFFER is 1024.
void CHAT::recvFile()
{
int fsize;
std::ofstream recvfile(filename, std::ios::app, std::ios::binary);
while ((fsize = recv(sockfd, filebuf, sizeof(filebuf), 0)) > 0)
{
recvfile.write(filebuf, sizeof(filebuf));
}
recvfile.close();
respond("Received file.\n");
}
这可行,但数据未完全写入文件中。例如;如果我发送一个 144 kb 的文件,它将在另一侧保存为 142 kb。程序就停在那里。
最后一个问题;如何在 C++ 中接收大/小文件?
编辑:在@Algirdas Preidžius Response 之后,我重新测试了它。以下是文件发送前后的部分截图。
这是在发送之前。
【问题讨论】:
-
这是一个错字:
std::ofstream recvfile(filename, std::ios::app, std::ios::binary);?不应该是std::ofstream recvfile(filename, std::ios::app | std::ios::binary);吗? -
天哪!是的,那是一个错字。感谢您指出这一点!
-
发送文件后让服务器关闭连接。这应该会导致
recv函数在客户端上退出。 -
@WBuck 没有别的办法吗?我不能只是关闭连接。
-
您需要以某种方式指示数据的结尾,例如发送数据前的长度并倒计时,或关闭/关闭远端。
标签: c++ windows networking winsock winsock2