重用套接字时出现套接字使用错误

2023-12-10

我正在用 c++ 编写一个 XMLRPC 客户端,旨在与 python XMLRPC 服务器通信。

不幸的是,此时,python XMLRPC 服务器只能在一个连接上处理一个请求,然后它就会关闭,我发现了这一点,这要归功于 mhawke 对我之前关于一个问题的查询的响应。相关主题

因此,每次我想要发出 XMLRPC 请求时,我都必须创建一个到 python 服务器的新套接字连接。这意味着创建和删除很多套接字。一切正常,直到我接近 4000 个请求。此时我收到套接字错误10048, 套接字正在使用中.

我尝试让线程休眠,让 Winsock 修复其文件描述符,当我的 Python 客户端遇到相同问题时,这个技巧就起作用了,但没有成功。 我尝试过以下方法

int err = setsockopt(s_,SOL_SOCKET,SO_REUSEADDR,(char*)TRUE,sizeof(BOOL));

没有成功。

我使用的是winsock 2.0,所以WSADATA::iMaxSockets 不应该发挥作用,无论哪种方式,我检查并将其设置为0(我认为这意味着无穷大)

在应用程序运行期间发出的 4000 个请求似乎并不奇怪。当服务器不断关闭和重新打开时,是否有某种方法可以在客户端使用 SO_KEEPALIVE ?

我完全错过了什么吗?


该问题是由于套接字处于 TIME_WAIT 状态而引起的,一旦关闭客户端的套接字就会进入该状态。默认情况下,套接字将保持此状态 4 分钟,然后才能重新使用。您的客户端(可能在其他进程的帮助下)在 4 分钟内将它们全部消耗掉。看这个答案以获得良好的解释和可能的非代码解决方案。

当您没有显式绑定套接字地址时,Windows 会动态分配 1024-5000 范围内的端口号(3977 个端口)。这段 Python 代码演示了这个问题:

import socket
sockets = []
while True:
    s = socket.socket()
    s.connect(('some_host', 80))
    sockets.append(s.getsockname())
    s.close()

print len(sockets)    
sockets.sort()
print "Lowest port: ", sockets[0][1], " Highest port: ", sockets[-1][1]
# on Windows you should see something like this...
3960
Lowest port: 1025  Highest port: 5000

如果您尝试再次立即运行此命令,它应该很快就会失败,因为所有动态端口都处于 TIME_WAIT 状态。

有几种方法可以解决这个问题:

  1. 管理您自己的端口分配和 使用bind()显式绑定您的 客户端套接字到特定端口 你每次增加 创建一个套接字。你仍然会有 处理端口的情况 已经在使用,但你不会 仅限于动态端口。例如

    port = 5000
    while True:
        s = socket.socket()
        s.bind(('your_host', port))
        s.connect(('some_host', 80))
        s.close()
        port += 1
    
  2. 摆弄 SO_LINGER 套接字 选项。我发现这 有时可以在 Windows 中工作(尽管 不太清楚为什么):s.setsockopt(socket.SOL_SOCKET, socket.SO_LINGER, 1)

  3. 我不知道这是否有帮助 您的特定应用, 但是,可以发送 多个 XMLRPC 请求 使用相同的连接多路通话方法。基本上 这可以让你积累 几个请求然后发送 一次全部。你不会得到任何 回复直到您实际发送 累积的请求,这样您就可以 本质上将其视为批处理 处理 - 这是否符合 你的应用程序设计?

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

重用套接字时出现套接字使用错误 的相关文章

随机推荐

  • 包含头文件时,路径区分大小写吗?

    给定这个目录树 src MyLibrary MyHeader h src file cpp file cpp include mylibrary myheader h 在 VS 中编译 file cpp 可以 在 gcc 中编译失败 标准怎
  • 防止未经授权的成员加入 Hazelcast 集群

    我们正在更改我们的一个应用程序以使用 Hazelcast 3 11 Community Edition 并在一些主机上运行的多个 JVM 之间进行一些锁定 我们按照语法配置集群 如下所示 public class HazelcastBuil
  • 获取JavaFX中节点的高度(生成布局通道)

    如何在JavaFX中获取节点的高度或首选高度 我有3VBox我想将节点添加到最自由的面板 例如 Childrens Total Height of the children s Sum VBoxA 5 890 VBoxB 4 610 VBo
  • 两台服务器之间的 DDP 不会重新连接

    我有两个流星应用程序通过不同服务器上的 DDP 连接 服务器 A 将数据发送到服务器 B 这就是它们的工作方式 Server A Items new Meteor Collection items Items insert name ite
  • 使用 Storyboard Segue iOS 将数据传递给视图控制器

    我知道有很多关于此的帖子 但我已经尝试了一切 但没有任何效果 因此 我尝试将两个视图控制器之间的对象传递给嵌入导航项中的 DBKIngredientsViewController 我有一个带有标识符 showIngredientsSegue
  • BoxPlot、Matplotlib 内的观察数量

    您好 我正在尝试使用 matplotlib 显示箱线图中的观察数量 一些虚假数据的例子是 data1 150 155 175 200 245 255 395 300 305 320 375 400 420 430 440 data2 225
  • 制作来自 Spirit Qi 的共享指针向量

    这是来自的后续问题上一个问题 我可以从我的语法中解析为字符串向量 但我似乎无法解析为向量指向字符串的共享指针 i e std vector
  • 需要 Pure/jQuery Javascript 解决方案来清除文本区域中的 Word HTML

    我知道这里已经谈到了这个问题 但我还没有找到适合我的情况的可行解决方案 所以我想让智囊团重新开始工作 看看能做些什么 我有一个表单中的文本区域 需要检测何时将某些内容粘贴到其中 并清除任何隐藏的 HTML 和引号 此表单的内容通过电子邮件发
  • 图片而不是单选按钮/文本?

    我有一个包含 9 个选项的单选框选项 我想用图像替换按钮及其旁边的文本 选择将显示 4 种颜色的色样范围 All Black Blue 巧克力 Plum Green Orange Magnolia Woods 因此 我需要所选选项旁边的箭头
  • 使用 Apache POI 获取单元格颜色

    我正在尝试学习如何在一个小项目中使用 Apache POI 我想使用 Excel 通过使用颜色编码的单元格来创建 房间布局 并将数据加载到 Java 程序中 我认为了解如何访问单元格的颜色属性 但我要问的是 是否可以访问空白单元格的颜色 无
  • Windows 安装程序使用 NT AUTHORITY\SYSTEM 而不是登录用户

    我有一个 Windows 安装程序 它在安装过程中创建数据库 安装应用程序时CREATE DATABASE由于 Windows 安装程序使用了错误的用户 进程失败 它正在使用NT AUTHORITY SYSTEM而不是使用登录用户 NT A
  • 无法在主方法中调用方法

    我正在尝试在另一个方法中调用一个方法 例如在 C 中 如下所示 public class Exercise1 Scanner scanner new Scanner System in public int FirstNumber publ
  • 具有行中多个 TextView 的自定义 TableLayout

    我想创建带有这样的行的自定义表格布局 TV 用于 TextView 即我想向该行添加 11 个 TextView 每行都以标题开始 然后添加 5 对 TextView 以便表行与屏幕一样宽 这是我的代码 public class FlowT
  • C# 中的度量单位 - 几乎

    灵感来自F 中的测量单位 并且尽管断言 here 你无法在 C 中做到这一点 前几天我有一个想法 我一直在研究它 namespace UnitsOfMeasure public interface IUnit public static c
  • Laravel 从多维集合中压平和提取

    我必须检索一个数组id从给定的集合中 类似 10 54 61 21等 我试过了flatten pluck 但除了foreach这是我想在这一步删除的东西 Model class Children extends Eloquent publi
  • 子表单从多个父表单获取属性

    我可以从两个父母那里获得查询值吗 FrmMasterItem and FrmMasterPackage 对于一份表格 FrmItemSearch 包含一个 DataGridView 并将所选值传递给其父 Form 我已经尝试过FrmItem
  • 类中的 Thread.__init__(self) 如何工作?

    所以我找到了这段代码 from threading import Thread class Example Thread def init self Thread init self def run self print It s work
  • Nodejs ppa:Chris-lea/node.js 失败

    Given a nodejs makefile其中包含安装 nodejs npm 和一些 npm 包的命令 例如 nodejs sudo add apt repository y ppa chris lea node js install
  • C++标准核心语言规范中的注释和示例是否不规范?

    我经常在 SO 和其他地方 上看到这样的说法 C 标准中的注释和示例是not规范性 我自己可能已经多次提出过这样的说法 然而 我在 C 标准的核心语言规范中找不到这一事实的证据 目前我正在查看 C 14 的 n3979 工作草案 我能找到的
  • 重用套接字时出现套接字使用错误

    我正在用 c 编写一个 XMLRPC 客户端 旨在与 python XMLRPC 服务器通信 不幸的是 此时 python XMLRPC 服务器只能在一个连接上处理一个请求 然后它就会关闭 我发现了这一点 这要归功于 mhawke 对我之前