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

File transfer with winsock (c++)

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

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 不等。我的错误在哪里?

您的代码需要 4 个修复:

  • 发件人需要获取 fread 的 return 值并在开始时发送那么多字节
  • 接收方需要写入 msg_len 字节而不是 sizeof(buffer)

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

  • 作为奖励项目,您应该从“(char)&buffer”中删除发件人中的 & 和 (char )。 "buffer"已经是缓冲区中第一个itgem的地址。