当没有数据可读取时,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() 会挂起一段时间 的相关文章

随机推荐

  • 材质按钮 切换组单选

    我怎样才能强制材质按钮切换组表现得像 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 数据 转发请求 就没有问题 但是当我从该套接字读取