使用 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++)的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 C++ 在 Winsock 中将大字符串从客户端发送到服务器