我正在用 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 状态。
有几种方法可以解决这个问题:
-
管理您自己的端口分配和
使用bind()
显式绑定您的
客户端套接字到特定端口
你每次增加
创建一个套接字。你仍然会有
处理端口的情况
已经在使用,但你不会
仅限于动态端口。例如
port = 5000
while True:
s = socket.socket()
s.bind(('your_host', port))
s.connect(('some_host', 80))
s.close()
port += 1
摆弄 SO_LINGER 套接字
选项。我发现这
有时可以在 Windows 中工作(尽管
不太清楚为什么):s.setsockopt(socket.SOL_SOCKET,
socket.SO_LINGER, 1)
我不知道这是否有帮助
您的特定应用,
但是,可以发送
多个 XMLRPC 请求
使用相同的连接多路通话方法。基本上
这可以让你积累
几个请求然后发送
一次全部。你不会得到任何
回复直到您实际发送
累积的请求,这样您就可以
本质上将其视为批处理
处理 - 这是否符合
你的应用程序设计?
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)