2016-11-28 3 views
0

動作しません。私はSO_KEEPALIVE、つまりSO_KEEPALIVEを設定しても動作しません!SO_KEEPALIVEが、私はこのライブラリを使用

<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> 

変なふうに、同様のコードはPHPで動作しない:私はテストのために、次のHTMLを使用し

#!/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() 

+1

キープアライブがご使用のサーバーで構成されていない可能性があります。私はfreebsdをチェックする方法を知らない。 PHPがもちろん動作する理由はわかりません...私がチェックするものを考えています。 – tdelaney

+1

キープアライブは、接続または受け入れがネゴシエートされているときなどの特定の過渡状態では設定できないという点で、奇妙です。これは、イベントで実行される非同期プロトコルでは問題になる可能性があります。いくつかのデータが到着するまでセットを遅らせることができますが、テストコードは何かを送る必要があります。 – tdelaney

+1

TCP keep aliveは、接続を開いたままにするのではなく、クリーンシャットダウンが行われなかった壊れた接続を早期に検出するためのものです。 –

答えて

2

TCPキープアライブは、ピアがもはや到達可能でないかどうかを検出すると(NAT用のソーホールータで採用のような)中間ステートフルパケットフィルタが離れて状態を投げていないことを確認することを意図しています。ペイロードサイズが0の「空の」TCPパケットを送信することで動作します。

TCP keep aliveはデータを転送しないため、アプリケーションレベルでアイドルタイムアウトが発生してもデータがない場合には役に立ちません転送されます。このためには、実際のデータ、つまり何らかの種類のハートビートを送信する必要があります。 WebSocketには、この目的のために「ping」と「pong」があります。documentation in pythonを参照してください。

+0

を助けていません。これはあまり役に立ちません – porton

+0

@porton:TCPソケットはデフォルトでタイムアウトしません。しかし、ソケット(SO_TIMEOUT)でタイムアウトを設定していたり​​、WebSocketライブラリが設定している可能性があります。しかし、これはアイドルタイムアウト(すなわちデータなし)なので、TCP keep aliveはここでも役に立たない。 –

+0

'grepを-riタイムアウト〜/ .localの/ libに/ python3.5 /は'私は、ライブラリのソースを読んで、空の出力 – porton

関連する問題