HTTP 服务器未将完整文件发送到 WGET、Firefox。连接被对等方重置?

2024-02-06

我正在编写一个 HTTP 服务器,但在发送较大的文件时遇到问题。如果我用 netcat 抓取它们,输出看起来很完美。如果我使用浏览器或 wget,有时我只能得到完整的文件。 WGET 不断收到“连接被对等方重置”错误,请参阅下面的输出。 Firefox 显示“连接已重置”。

下面是向客户端发送数据的相关流程:

int handle_request(int sockfd, struct cached_file content) {
    char buffer[1024]; // FIXME hardcoded arbitrary buffer size for header

    unsigned int sent_bytes;
    unsigned int total = 0;
    unsigned int bytes_left = content.size;

    printf("I have to send %u bytes of content.\n", content.size);

    snprintf(buffer, 1024, "HTTP/1.1 %s\nContent-Type: %s\nContent-Length: %s\n\n", content.statuscode, content.contenttype, content.sizestring);
    sent_bytes = send(sockfd, buffer, strlen(buffer), MSG_MORE);
    printf("I wanted to send %u bytes of header, and I sent %u.\n", strlen(buffer), sent_bytes);

    while (total < bytes_left) {
        sent_bytes = send(sockfd, content.data+total, bytes_left, 0);
        if (sent_bytes == -1) { 
            printf("send() returned -1\n");
            break; 
        }

        total      += sent_bytes;
        bytes_left -= sent_bytes;
    }
    printf("I sent %u bytes of content. I had %u left to send.\n", total, bytes_left);

    if (sent_bytes == -1)
        logprint("socket error!", errno);
}

这是 wget 尝试获取文件的输出:

wget --tries 1 http://localhost:8081/image.jpg
--2015-07-01 13:21:42--  http://localhost:8081/image.jpg
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:8081... failed: Connection refused.
Connecting to localhost (localhost)|127.0.0.1|:8081... connected.
HTTP request sent, awaiting response... 200 OK
Length: 700895 (684K) [image/jpeg]
Saving to: ‘image.jpg.10’

image.jpg.10                      53%[===============================>                             ] 363.31K  --.-KB/s   in 0.001s 

2015-07-01 13:21:42 (688 MB/s) - Read error at byte 372031/700895 (Connection reset by peer). Giving up.

wget --tries 1 http://localhost:8081/image.jpg
--2015-07-01 13:21:43--  http://localhost:8081/image.jpg
Resolving localhost (localhost)... ::1, 127.0.0.1
Connecting to localhost (localhost)|::1|:8081... failed: Connection refused.
Connecting to localhost (localhost)|127.0.0.1|:8081... connected.
HTTP request sent, awaiting response... 200 OK
Length: 700895 (684K) [image/jpeg]
Saving to: ‘image.jpg.11’

image.jpg.11                       6%[==>                                                          ]  42.69K  --.-KB/s   in 0s     

2015-07-01 13:21:43 (500 MB/s) - Read error at byte 43711/700895 (Connection reset by peer). Giving up.

调试 http 服务器的输出:

I have to send 700895 bytes of content.
I wanted to send 65 bytes of header, and I sent 65.
I sent 700895 bytes of content. I had 0 left to send.

我希望能有另一双眼睛来关注此事!为什么会发生这种情况以及如何解决它?


我的猜测是该错误与您未在此处显示的代码有关。

简单实现中的一个常见错误是没有完全读取请求,而是只读取第一行或一些字节来确定请求的页面,然后发送响应并最后关闭。

由于在关闭时仍有来自客户端的未读数据,这将导致对等方重置连接。使用 nc 时看不到这种效果,因为使用 nc 发送的请求可能比浏览器发出的请求短,因此在 nc 情况下会读取请求中的所有数据,但在浏览器情况下不会读取。

除此之外,即使浏览器接受您的响应也是无效的。您的状态行(第一行)在状态代码之后停止,而不是添加原因短语,请参阅http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1 http://www.w3.org/Protocols/rfc2616/rfc2616-sec6.html#sec6.1。另外,你使用\n代替\r\n作为行分隔符。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

HTTP 服务器未将完整文件发送到 WGET、Firefox。连接被对等方重置? 的相关文章

随机推荐

  • 在Python中将数组的数组转换为json[重复]

    这个问题在这里已经有答案了 我有一个数组数组 它 是从数据库查询中获取的SQL炼金术我想做两件事 我想获取列的名称 或类似的名称 从表中选择全名 AS 姓名 我想将最终产品转换为 json 对象数组 以便我可以在前端使用它 我已经搜索了几个
  • 将 .net 方法公开为 Excel 函数?

    我有一组计算方法位于 Net DLL 中 我想让 Excel 2003 用户可以使用这些方法 以便他们可以在电子表格中使用它们 例如我的 net方法 public double CalculateSomethingReallyComplex
  • 查找二进制中类符号的来源

    我有一个有趣的问题 我收到的崩溃日志引用了我的应用程序中名为 NRURLProtocol 的类 特别是在文件 NRURLProtocol m 中 根据崩溃日志 该日志存在于我的应用程序中 而不是存在于 iOS 框架中 但是 我的项目中没有
  • VSCODE 笔记本 - 是否可以仅显示大纲中的 Markdown 标题?

    我使用 Markdown 标题在笔记本中导航 但我也倾向于制作大量 非标题 Markdown 笔记 两者都出现在大纲中 随着笔记本变大 找到正确的标题变得相当困难 有没有办法抑制大纲中显示的普通降价单元格 我关注了 github 和 at
  • 如何将与字段关联的对象列表检索到实体类中?

    当我通过任何字段找到客户时 一切都很顺利 我得到了带有返回的全局对象的 JSON 我正在编写代码来查找Customer由于他们lastName 客户实体有一个对象 其中的字段lastName被宣布 因此 我希望我的端点像第一种情况一样返回客
  • 从 .NET 中的堆栈帧获取参数值?

    我希望能够从 NET中的堆栈帧中获取所有参数值 有点像在 Visual Studio 调试器中查看调用堆栈中的值的方式 我的方法集中于使用堆栈框架类 http msdn microsoft com en us library system
  • 从 iPad (目标 C) 到 MVP Web API (C#) 的时区映射

    我有一个 Web 服务 MVC Web API 我在其中存储 UTC 格式的日期时间值 iPad 与 API 进行通信 并将传递标头中的时区设置 API 会根据 iPad 发送的时区将 UTC 值转换为正确的本地时间 看来我需要 Objec
  • 如何对齐多个表单元素?

    I ve no clue at design and I m trying to get a simple HTML form to look like this 基本上 它是一个表格three输入字段和one提交按钮 关于输入字段 有上面
  • 使用 Complete.ly 或 typeahead 检测并禁用移动设备上的自动完成功能

    在我的项目中我想使用 Complete ly 参见http complete ly appspot com http complete ly appspot com 或 typeahead js 参见http twitter github
  • javascript - 将数组转换为字符串,同时保留括号

    我有一个多维数组 如下所示 var myArray 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 1 2 3 4 5 我希望将其内容放在 div 中 以便可以轻松复制和粘贴 然而 当我这样做时 var x document g
  • 在 Visual Studio 中监视调用堆栈大小

    有没有办法监视 Visual Studio 中的调用堆栈大小 运行时会提供一个调用堆栈窗口 但不显示堆栈的大小 我正在使用 C 并面临堆栈溢出问题 我知道我正在使用的某些递归函数可能有问题 但在解决这些问题之前 我想监视调用堆栈大小以了解发
  • 构建 Apache Zeppelin 时出现错误

    我已经用cloudera 设置了hadoop 我想安装 zeppelin 来连接 hive 并为我的查询构建 UI 使用以下命令构建 zeppelin 命令时 sudo mvn clean package Pspark 1 3 Dspark
  • 由 WPF 应用程序托管时,Win32 应用程序不受 dpi 设置的影响

    我正在 wpf 应用程序中作为一个孩子启动一个旧的 win32 应用程序 问题是 win32 应用程序作为 wpf 应用程序的子应用程序运行时会忽略 dpi 设置 当 win32 应用程序在自己的窗口中启动时 dpi 设置可以达到预期的效果
  • 在 ASP.NET MVC 后的 ajax 中包含 antiforgerytoken

    我在使用 ajax 时遇到 AntiForgeryToken 问题 我正在使用 ASP NET MVC 3 我尝试了以下解决方案jQuery Ajax 调用和 Html AntiForgeryToken https stackoverflo
  • xcode 4.4 中的自动属性合成是如何工作的?

    我是 Objective C 和 XCode 的新手 但我很高兴看到 XCode 4 4 现在自动为我合成我的属性 我认为这意味着我不再需要为我的属性输入 synthesize 并且我可以使用以下方式访问它们self propertyNam
  • 打开一个新的 javascript 窗口(.open) 及其 CSS 样式

    我正在尝试让这个功能在我正在开发的项目的网站上运行 此函数的目的是仅 物理地 打印子 div 的内容 该子 div 巧合地称为选择器 content 这是我到目前为止所掌握的一点点 当用户点击 打印 超链接时 该函数就会被触发 新窗口将加载
  • 如何向图像添加 JPEG 注释 (COM)?

    我正在尝试使用 WPF 将 JPEG 注释添加到图像文件 尝试下面的代码让我ArgumentOutOfRangeException 设置其他属性没有问题 using Stream read File OpenRead my jpeg Jpe
  • Django - PUT/DELETE 请求中的参数存储在哪里?

    我想为我的新 django 项目遵循 RESTful 模式 并且我想知道发出 PUT DELETE 请求时参数在哪里 据我所知 我只在请求中看到 GET 和 POST QueryDict 没有其 他 Django 是否添加了与请求相关的新
  • 我的应用程序崩溃了,因为 firebase admob 依赖项抖动

    我按照这里的说明进行操作 https pub dartlang org packages firebase admob readme tab https pub dartlang org packages firebase admob re
  • HTTP 服务器未将完整文件发送到 WGET、Firefox。连接被对等方重置?

    我正在编写一个 HTTP 服务器 但在发送较大的文件时遇到问题 如果我用 netcat 抓取它们 输出看起来很完美 如果我使用浏览器或 wget 有时我只能得到完整的文件 WGET 不断收到 连接被对等方重置 错误 请参阅下面的输出 Fir