使用winsock进行文件传输(c ++)

时间:2016-04-03 20:22:22

标签: c++ sockets winsock

我无法使用套接字传输文件。我的意思是它可以传输文件,但它总是不同大小。转移代码的片段:

FILE *inFile = fopen(this->FullDir, "r+b");
//FILE *outFile = fopen(this->DeskDir, "w+b");
if (inFile != 0)
{
    char* buffer[16384]; //выделяем блок 16Кб
    while (!feof(inFile)) //пока не конец файла
    {
        fread(buffer, 1, sizeof(buffer), inFile); //копируем блок
        send(s, (char*)&buffer, sizeof(buffer), 0);//передаём блок
    }
}

接待:

do
 {
    msg_len = recv(new_client_socket, (char*)&buffer, MAX_MESSAGE_LENGTH, 0);
    fwrite(buffer, 1, sizeof(buffer), output);
  } while (msg_len > 0);

文件大小为2,50Mb;大小从1MB到2.2Mb不等。我的错误在哪里?

1 个答案:

答案 0 :(得分:1)

您的代码需要4个修复程序:

  • 发件人需要获取fread的返回值并最初发送那么多字节
  • 接收者需要写msg_len字节而不是sizeof(缓冲区)

  • 特别是如果发送套接字设置为非阻塞模式,send()函数可能不会在一次调用中发送所有给定数据。你需要查看send()的返回值,并有一个循环发送()数据并推进缓冲区,直到所有数据都被发送

  • 作为奖励项目,您应该删除&并且(char )在"(char )& buffer"中投放在发件人中。 "缓冲器"已经是缓冲区中第一个itgem的地址。