使用套接字发送文件
Posted
技术标签:
【中文标题】使用套接字发送文件【英文标题】:Sending Files With Sockets 【发布时间】:2011-05-16 18:52:57 【问题描述】:我正在尝试创建一个基本的 HTTP 服务器,以了解有关它如何工作的更多信息。我在向客户端发送二进制文件时遇到了困难。我的代码如下:
char * buffer = (char *)malloc(sizeof(char) * 512);
fseek(content_file, 0, SEEK_SET);
while (!feof(content_file))
size_t read = fread(buffer, sizeof(char), sizeof(buffer), content_file);
if (read > 0)
client->send((const void *)buffer);
fclose(content_file);
free(buffer);
现在我知道它可以在读取最后一个块后发送一些不必要的数据,但在尝试修复它之前,我想知道它有什么问题。它适用于文本文件,我正在使用 fgets。但是在切换到 fread 支持二进制文件后,文本文件损坏并变成这样:ThisÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍÍ
(“This”是发送数据中唯一正确的部分)
显然我遗漏了一些东西,但你能帮我正确地做到这一点吗?
编辑:
使用buffer_size
值而不是sizeof(buffer)
修复了丢失/损坏的数据问题。
【问题讨论】:
你能告诉我们cleint->send
的签名和/或代码吗?具体来说,它如何知道要发送多少字节?
哦,我太傻了,我在客户端使用 strlen->send :-) 谢谢,但我无法将您的评论标记为解决方案,所以我会继续标记 Bo 的。
【参考方案1】:
你的问题是 sizeof(buffer)
给你指针的大小,而不是它指向的大小。
添加buffer_size
并将其用于malloc
和freed
。
【讨论】:
您可以使用以下代码获取文件大小:fseek (fp, 0, SEEK_END); ulFileSize = ftell (fp); fseek (fp, 0, SEEK_SET); 谢谢,CariElf。这就是我正在使用的。以上是关于使用套接字发送文件的主要内容,如果未能解决你的问题,请参考以下文章