因此,FreeBSD上Python的_KEEPALIVE不起作用
我使用这个库: 当我运行下面的程序(在FreeBSD上同时运行Python2.7和Python3.5)时,它会在305秒后超时,尽管我设置了因此,FreeBSD上Python的_KEEPALIVE不起作用,python,networking,tcp,websocket,Python,Networking,Tcp,Websocket,我使用这个库: 当我运行下面的程序(在FreeBSD上同时运行Python2.7和Python3.5)时,它会在305秒后超时,尽管我设置了SO_KEEPALIVE,也就是说SO_KEEPALIVE不起作用 #!/usr/bin/python import socket from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket class MyWebSocket(WebSocket): def handle
SO_KEEPALIVE
,也就是说SO_KEEPALIVE
不起作用
#!/usr/bin/python
import socket
from SimpleWebSocketServer import SimpleWebSocketServer, WebSocket
class MyWebSocket(WebSocket):
def handleConnected(self):
print(self.address, 'connected')
self.client.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
#self.client.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 3600)
#self.client.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 3600)
self.client.settimeout(3600)
class MyWebSocketServer(SimpleWebSocketServer):
def _decorateSocket(self, sock):
sock.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)
#sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 3600)
#sock.setsockopt(socket.IPPROTO_TCP, socket.TCP_KEEPIDLE, 3600)
sock.settimeout(3600)
print("socket decorated: ", sock.getsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE))
return sock
server = MyWebSocketServer('', 9000, MyWebSocket)
server.serveforever()
我使用以下HTML进行测试:
<html><head><meta charset="UTF-8"/><title>WebSocket</title>
<script type="text/javascript">
var socket;
function setupWebSocket() {
var host = "ws://XXX:9000/";
try {
socket = new WebSocket(host);
var start = (new Date()).getTime();
socket.onclose = function(msg) {
var secs = (new Date()).getTime() - start;
alert("disconnected after "+(secs/1000)+" sec");
};
}
catch(ex){
alert(ex);
}
}
</script>
</head>
<body onload="setupWebSocket()">
</body>
</html>
WebSocket
无功插座;
函数setupWebSocket(){
var host=“ws://XXX:9000/”;
试一试{
套接字=新的WebSocket(主机);
var start=(新日期()).getTime();
socket.onclose=函数(msg){
var secs=(new Date()).getTime()-start;
警报(“在“+(秒/1000)+”秒之后断开连接”);
};
}
捕获(ex){
警报(ex);
}
}
奇怪的是,类似的代码也适用于PHP。TCP保持活动旨在检测对等方是否不再可访问,并确保中间状态包过滤器(如SoHo路由器用于NAT)不会丢弃状态。它通过发送有效负载大小为0的“空”TCP数据包来工作
由于TCP keep alive不传输任何数据,因此,如果在应用程序级别有空闲超时(在没有传输数据时触发),则不会有帮助。为此,您需要发送实际数据,即某种心跳。WebSocket具有“ping”和“pong”功能。为此,请参阅。TCP保持活动旨在检测对等方是否不再可访问,并确保中间状态包过滤器(如SoHo路由器中用于NAT的过滤器)不会丢弃状态。它通过发送有效负载大小为0的“空”TCP数据包来工作
由于TCP keep alive不传输任何数据,因此,如果在应用程序级别有空闲超时(在没有传输数据时触发),则不会有帮助。为此,您需要发送实际数据,即某种心跳。WebSocket具有“ping”和“pong”功能。为此,请参阅。您的服务器上可能未配置keepalive。我不知道如何查看freebsd。当然,这并不能解释为什么PHP可以工作。。。想想我会检查什么。keepalive很奇怪,因为它可能不会在某些过渡状态下设置,例如在协商连接或接受时。对于在事件上运行的异步协议来说,这可能是一个问题。您可以延迟设置,直到一些数据到达检查。。。但是,您的测试代码也必须发送一些内容。TCP保持活动并不是为了保持连接打开,而只是为了在没有完全关闭的情况下及早检测断开的连接。保持连接的正确方法是什么(在延长的时间内没有传递基本数据)打开?@SteffenUllrich是对的-只要对等应用程序保持打开状态,套接字就会保持打开状态。。。。大部分。介入网络,如NAT、防火墙和调制解调器连接(我知道,这是80年代)可能需要定期查看流量,以保持其连接部分的正常运行。但是应用程序本身没有看到keepalive,所以如果连接超时,它仍然会发生。有时,您可以通过发送一些非常无趣的内容来攻击应用程序,并且某些protcol允许应用程序级ping保持活动状态。您的服务器上可能未配置keepalive。我不知道如何查看freebsd。当然,这并不能解释为什么PHP可以工作。。。想想我会检查什么。keepalive很奇怪,因为它可能不会在某些过渡状态下设置,例如在协商连接或接受时。对于在事件上运行的异步协议来说,这可能是一个问题。您可以延迟设置,直到一些数据到达检查。。。但是,您的测试代码也必须发送一些内容。TCP保持活动并不是为了保持连接打开,而只是为了在没有完全关闭的情况下及早检测断开的连接。保持连接的正确方法是什么(在延长的时间内没有传递基本数据)打开?@SteffenUllrich是对的-只要对等应用程序保持打开状态,套接字就会保持打开状态。。。。大部分。介入网络,如NAT、防火墙和调制解调器连接(我知道,这是80年代)可能需要定期查看流量,以保持其连接部分的正常运行。但是应用程序本身没有看到keepalive,所以如果连接超时,它仍然会发生。有时,你可以通过发送一些非常无趣的东西来攻击应用程序,一些protcol允许应用程序级ping保持活动状态。空闲超时似乎发生在FreeBSD内核级,而不是“应用程序级”。所以这没有帮助much@porton:TCP套接字默认情况下不会超时。但是您可能已经在某个地方配置了套接字超时(sou timeout),或者WebSocket库已经配置了超时。但是这是一个空闲超时(即没有数据),因此TCP保持活动在这里也没有帮助。
grep-ri timeout~/.local/lib/python3.5/
生成一个空输出,我已经读取了库的源代码。它只在select()中有超时call@porton:由于您使用设置套接字超时的settimeout(3600)
,因此它不应该是套接字超时,至少在您的站点上不应该是。但是它当然可以关闭空闲连接。您得到的错误到底是什么(问题中没有显示)?空闲超时似乎发生在FreeBSD内核级别,而不是“应用程序级别”。所以这没有帮助much@porton:TCP套接字默认情况下不会超时。但是您可能已经在某个地方配置了套接字超时(sou timeout),或者WebSocket库已经配置了超时。但是这是一个空闲超时(即没有数据),因此TCP保持活动在这里也没有帮助。grep-ri timeout~/.local/lib/python3.5/
生成一个空输出,我已经读取了库的源代码。它只在select()中有超时call@porton:由于您使用设置套接字超时的settimeout(3600)
,因此它不应该是套接字超时,至少在您的站点上不应该是。但是它当然可以关闭空闲连接。您得到的错误具体是什么(问题中未显示)?