c – 重用套接字时出现套接字使用错误
我在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状态. 有几种方法可以解决这个问题: >管理您自己的端口分配和 port = 5000 while True: s = socket.socket() s.bind(('your_host',port)) s.connect(('some_host',80)) s.close() port += 1 >摆弄SO_LINGER插座 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |