当没有数据可读取时,Socket read() 会挂起一段时间

2024-03-11

你好,我正在编写一个简单的 http 端口转发器。我从端口 80 读取数据,并将数据传递到端口 8080 上的 lighttpd 服务器。

只要我在端口 8080 上的套接字上 write() 数据(转发请求)就没有问题,但是当我从该套接字读取()数据(转发响应)时,最后一个 read() 挂起很多(大约 1或 2 秒),然后意识到没有更多数据并返回 0。

我尝试将套接字设置为非阻塞,但这不起作用,因为有时即使还剩下一些数据,它也会返回 EWOULDBLOCKING(lighttpd + cgi 可能非常慢)。 我尝试使用 select() 设置超时,但是,如上所述,当实际有一些数据要传输时,缓慢的 cgi 可能会使套接字超时。


更新:已解决。毕竟这是保活。在我的lighttpd配置文件中禁用它后,整个过程完美运行。


好吧,为了完整起见,根据我的评论:

HTTP 服务器本身(在您的情况下为 lighttpd)可能正在与您的代理保持持久连接,因为您的代理中继了一个包含“Connection: keep-alive”。当客户端想要通过同一连接发出多个请求时,此标头会有所帮助。因此,因为 lighttpd 收到了这个标头,所以它假设它将接收进一步的请求并保持套接字打开,从而导致read阻止您的代理。

在 lighttpd 配置中禁用 keep-alive 是解决此问题的一种方法,但您也可以删除“Connection: keep-alive“在将其转发到网络服务器之前从标头中获取。

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

当没有数据可读取时,Socket read() 会挂起一段时间 的相关文章

  • Web 客户端和 Expect100Continue

    使用 WebClient C NET 时设置 Expect100Continue 的最佳方法是什么 我有下面的代码 我仍然在标题中看到 100 continue 愚蠢的 apache 仍然抱怨 505 错误 string url http
  • 动态加载程序集的应用程序配置

    我正在尝试将模块动态加载到我的应用程序中 但我想为每个模块指定单独的 app config 文件 假设我的主应用程序有以下 app config 设置
  • Google BQ:运行参数化查询,其中参数变量是 BQ 表目标

    我正在尝试从 Linux 命令行为 BQ 表目标运行 SQL 此 SQL 脚本将用于多个日期 客户端和 BQ 表目标 因此这需要在我的 BQ API 命令行调用中使用参数 标志 parameter 现在 我已经点击此链接来了解参数化查询 h
  • 我们真的应该使用 Chef 来管理 sudoers 文件吗?

    这是我的问题 我担心如果 Chef 破坏了 sudoers 文件中的某些内容 可能是 Chef 用户错误地使用了说明书 那么服务器将完全无法访问 我讨厌我们完全失去客户的生产服务器 因为我们弄乱了 sudoers 文件并且无法再通过 ssh
  • 在 Windows 窗体中保存带有 Alpha 通道的单色位图会保存不同(错误)的颜色

    在 C NET 2 0 Windows 窗体 Visual Studio Express 2010 中 我保存由相同颜色组成的图像 Bitmap bitmap new Bitmap width height PixelFormat Form
  • 如何从 appsettings.json 文件中的对象数组读取值

    我的 appsettings json 文件 StudentBirthdays Anne 01 11 2000 Peter 29 07 2001 Jane 15 10 2001 John Not Mentioned 我有一个单独的配置类 p
  • 关于 C++ 转换:参数 1 从“[some_class]”到“[some_class]&”没有已知的转换

    我正在研究 C 并且遇到了一个错误 我不知道确切的原因 我已经找到了解决方案 但仍然想知道原因 class Base public void something Base b int main Base b b something Base
  • 将 VSIX 功能添加到 C# 类库

    我有一个现有的单文件生成器 位于 C 类库中 如何将 VSIX 项目级功能添加到此项目 最终目标是编译我的类库项目并获得 VSIX 我实际上是在回答我自己的问题 这与Visual Studio 2017 中的单文件生成器更改 https s
  • 重载<<的返回值

    include
  • while 循环中的 scanf

    在这段代码中 scanf只工作一次 我究竟做错了什么 include
  • 转发声明和包含

    在使用库时 无论是我自己的还是外部的 都有很多带有前向声明的类 根据情况 相同的类也包含在内 当我使用某个类时 我需要知道该类使用的某些对象是前向声明的还是 include d 原因是我想知道是否应该包含两个标题还是只包含一个标题 现在我知
  • 如何查看网络连接状态是否发生变化?

    我正在编写一个应用程序 用于检查计算机是否连接到某个特定网络 并为我们的用户带来一些魔力 该应用程序将在后台运行并执行检查是否用户请求 托盘中的菜单 我还希望应用程序能够自动检查用户是否从有线更改为无线 或者断开连接并连接到新网络 并执行魔
  • 这些作业之间是否存在顺序点?

    以下代码中的两个赋值之间是否存在序列点 f f x 1 1 x 2 不 没有 在这种情况下 标准确实是含糊不清的 如果你想确认这一点 gcc 有这个非常酷的选项 Wsequence point在这种情况下 它会警告您该操作可能未定义
  • 覆盖子类中的字段或属性

    我有一个抽象基类 我想声明一个字段或属性 该字段或属性在从该父类继承的每个类中具有不同的值 我想在基类中定义它 以便我可以在基类方法中引用它 例如覆盖 ToString 来表示 此对象的类型为 property field 我有三种方法可以
  • 将控制台重定向到 .NET 程序中的字符串

    如何重定向写入控制台的任何内容以写入字符串 对于您自己的流程 Console SetOut http msdn microsoft com en us library system console setout aspx并将其重定向到构建在
  • 混合 ExecutionContext.SuppressFlow 和任务时 AsyncLocal.Value 出现意外值

    在应用程序中 由于 AsyncLocal 的错误 意外值 我遇到了奇怪的行为 尽管我抑制了执行上下文的流程 但 AsyncLocal Value 属性有时不会在新生成的任务的执行范围内重置 下面我创建了一个最小的可重现示例来演示该问题 pr
  • UDP SocketException - 通常只允许每个套接字地址使用一次

    尽管这里有很多非常相似的问题 但提供的答案都没有帮助我 这让我很难过 我有一个非常大的管理系统 我的任务是为其编写一些 UDP 数据包发送 接收 我已经编写了一个原型 一切都很好 所以我开始将我的代码合并到所述系统中 然而 我现在弹出了一个
  • 测试用例执行完成后,无论是否通过,如何将测试用例结果保存在变量中?

    我正在使用 NUNIT 在 Visual Studio 中使用 Selenium WebDriver 测试用例的代码是 我想在执行测试用例后立即在变量中记录测试用例通过或失败的情况 我怎样才能实现这一点 NUnit 假设您使用 NUnit
  • 如何将服务器服务连接到 Dynamics Online

    我正在修改内部管理应用程序以连接到我们的在线托管 Dynamics 2016 实例 根据一些在线教程 我一直在使用OrganizationServiceProxy out of Microsoft Xrm Sdk Client来自 SDK
  • 使用.NET技术录制屏幕视频[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 有没有一种方法可以使用 NET 技术来录制屏幕 无论是桌面还是窗口 我的目标是免费的 我喜欢小型 低

随机推荐

  • 材质按钮 切换组单选

    我怎样才能强制材质按钮切换组表现得像 RadioGroup 一样 总是至少有一个选定的项目 环境setSingleSelection true 如果您单击组中的按钮两次 还可以增加不选择任何内容的可能性 这是我的代码
  • 暂时禁用 Lollipop CheckBox 上的动画

    我有一个 ListView 其中包含复选框的行 此 ListView 附加了过滤行为 它通过设置新数据来回收这些行 通过一个简单的setData 方法 随着过滤条件的变化 发生这种情况时 任何具有以下属性的回收行checked状态更改将更新
  • Hibernate 4 和 joda-time

    他们婚姻幸福吗 我使用的是最新版本的 hibernate 4 和 1 3 版本joda 时间休眠支持 http www joda org joda time hibernate 我也认为这是当前的最新版本 使用注释时 一切似乎都工作正常 按
  • 使用 Rspec 测试“创建后”

    我正在尝试使用 Rspec 测试 创建后 操作 代码如下 def valid attributes zone gt Flymgr Zone new countries gt Flymgr ZoneCountry first name gt
  • 无需正则表达式即可简单搜索和替换

    我有一个包含各种通配符的文件 我希望能够从 Bash shell 脚本中替换它 我有以下内容 该内容非常有效 直到其中一个变量包含正则表达式特有的字符 VERSION 1 0 perl i pe s VERSION VERSION g tx
  • 经典asp中的vbscript语法

    我有一个 vbscript 我想在其中运行一种asp 我在运行脚本时遇到问题 所以我想我需要一些帮助来确保 asp 知道它是 vvbscript 或其他东西 最后一个脚本是我运行时遇到问题的脚本 这是我所拥有的
  • 当以字符串形式给出方法名称时,如何调用 Java 方法?

    如果我有两个变量 Object obj String methodName getName 在不知道班级的情况下obj 我怎样才能调用由methodName on it 被调用的方法没有参数 并且有一个String返回值 它是Java be
  • 基于整数而不是字符串按升序对数组进行排序

    我有一个具有以下结构的数组 myArray
  • 如何使用 Koala gem 获取 Facebook 用户的照片?

    我正在尝试使用以下方法获取 Facebook 用户朋友的照片 他们的 facebook id 但使用以下代码返回 nil 图片网址 我使用的代码如下 picture url user get picture 1000000111 其中 us
  • TDictionary 保存到文件

    我有很多文件 大约 160 000 个 我需要有关文件中各个单词的位置的信息 全文 所以我这样使用字典 WordDict TDictionary
  • 在 MVC 核心中搭建控制器时未找到主键

    当尝试搭建控制器时 出现以下错误 运行选定的代码生成器时出错 实体 类型 Company Models Office 需要在以下位置定义主键 Microsoft VisualStudio Web CodeGeneration ActionI
  • OpenGL 点精灵可以在 Android 中使用吗?

    我正在 Droid 版本 2 1 update1 上进行开发 我支持的 GL 扩展包括 GL OES point sprite 和 GL OES point size array 我无法获取要渲染的点精灵 下面的代码在 glTexEnvi
  • 控制器间通信,角度方式

    我试图找出控制器 指令之间共享属性或状态的 首选 或 角度方式 有多种方法可以实现这一点 但我想遵循最佳实践 下面是一些如何实现这一点的平庸示例 1 使用 scope watch The parent controller scope an
  • 更改所有字符串属性最大长度

    在 EF 6 中我可以这样做 modelBuilder Properties Where p gt p PropertyType typeof string p GetCustomAttributes typeof MaxLengthAtt
  • Base64 值不是有效图像

    对于电子商务 我需要从 SOAP Web 服务获取产品图像 Web 服务的图像以 base64 编码 在我这边 我必须解码它们以将它们保存在 WordPress 目录中 我的所有代码都有效 即使它远非完美 唯一的问题是我无法从下面的 SOA
  • 为什么这个 Angular 应用程序无法处理用户状态(登录\退出),从而在用户登录后更改显示内容?

    我正在使用 AngularUI Angular 包 这个 https www npmjs com package firebaseui angular https www npmjs com package firebaseui angul
  • Bootstrap 4 动画列宽变化

    我有两列这样的 div class container div class row div class col 9 div div class col 3 div div div 我通过 Angular 将类名切换为col 8 offset
  • 在 Eclipse 中构建 Makefile 项目的步骤

    我正在尝试使用 Eclipse 构建一些现有软件 用 C 编写 它是使用 Makefile 构建的 为此 我在 Eclipse 中创建了一个 Makefile 项目 然而 我刚刚发现 在 C C 构建 设置 菜单中 我只看到 二进制解析器
  • 如何从 Windows 环境将 Xcode 项目添加到 Github 存储库

    看到我的问题标题后 您可能会认为以前已经问过此类问题 然而这并不重复 请阅读下面的内容来了解 我正在开发IOS应用程序 每当我有时间的时候 我都会使用图书馆的 PC 或朋友的 MacBook 来开发或更改现有项目 然后压缩该项目并将其上传到
  • 当没有数据可读取时,Socket read() 会挂起一段时间

    你好 我正在编写一个简单的 http 端口转发器 我从端口 80 读取数据 并将数据传递到端口 8080 上的 lighttpd 服务器 只要我在端口 8080 上的套接字上 write 数据 转发请求 就没有问题 但是当我从该套接字读取