使用套接字发送文件

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 并将其用于mallocfreed

【讨论】:

您可以使用以下代码获取文件大小:fseek (fp, 0, SEEK_END); ulFileSize = ftell (fp); fseek (fp, 0, SEEK_SET); 谢谢,CariElf。这就是我正在使用的。

以上是关于使用套接字发送文件的主要内容,如果未能解决你的问题,请参考以下文章

使用 C 中的套接字通过 TCP 发送音频文件

C:发送文件到套接字

使用 Netcat 将二进制文件(逐行)发送到套接字服务器

使用java中的套接字将文件从一个客户端发送到另一个客户端

QTcp [服务器和套接字]:无法读取发送的文件

通过 posix 套接字发送文件时的零窗口