ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2019-07-16 01:58:57  阅读:199  来源: 互联网

标签:python c-2 sockets xml-rpc


我在c中编写一个XMLRPC客户端,用于与python XMLRPC服务器通信.

不幸的是,此时,python XMLRPC服务器只能在连接上发出一个请求,然后关闭,我发现这要归功于mhawke对我之前关于related subject的查询的回复

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

我试过睡觉线程让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分钟内消耗它们.有关详细说明和可能的非代码解决方案,请参阅this answer.

当您没有显式绑定套接字地址时,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请求
使用相同的连接
multicall方法.基本上
这可以让你积累
几个请求,然后发送它们
一次全部.你不会得到任何
响应,直到你实际发送
积累的请求,所以你可以
基本上认为这是批量
处理 – 这是否适合
你的应用设计?

标签:python,c-2,sockets,xml-rpc
来源: https://codeday.me/bug/20190716/1473161.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有