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

Posted

技术标签:

【中文标题】使用 winsock 进行文件传输 (c++)【英文标题】:File transfer with winsock (c++) 【发布时间】:2016-04-03 20:22:21 【问题描述】:

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

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

【问题讨论】:

您确定要写sizeof(buffer)吗?我的意思是,它是整个缓冲区中的字节数,而不是大小。另外,我怀疑缓冲区是否已满。 顺便说一句:我指的是fwrite 我试过sizeof(buffer)和MAX_MESSAGE_LENGTH(16384),结果总是一样 msg_len 的值是多少?在fwrite 期间,您不应尝试向output 写入更多内容 msg_len 总是返回 16384 【参考方案1】:

您的代码需要 4 个修复:

发送方需要获取 fread 的返回值并最初发送那么多字节

接收方需要写入 msg_len 字节而不是 sizeof(buffer)

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

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

【讨论】:

以上是关于使用 winsock 进行文件传输 (c++)的主要内容,如果未能解决你的问题,请参考以下文章

winsock是啥,是一门语言还是一个文件?

如何使用 C++ 在 Winsock 中将大字符串从客户端发送到服务器

C++中用winsock进行通信的具体步骤是啥样呢?

C++ Winsock P2P

在 Visual Studio 中显示 C++ 文件的 #include 层次结构

C++ winsock 错误