Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/305.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
因此,FreeBSD上Python的_KEEPALIVE不起作用_Python_Networking_Tcp_Websocket - Fatal编程技术网

因此,FreeBSD上Python的_KEEPALIVE不起作用

因此,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

我使用这个库:

当我运行下面的程序(在FreeBSD上同时运行Python2.7和Python3.5)时,它会在305秒后超时,尽管我设置了
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)
,因此它不应该是套接字超时,至少在您的站点上不应该是。但是它当然可以关闭空闲连接。您得到的错误具体是什么(问题中未显示)?