2016-11-29 4 views
0

私はFreeBSD上で、次のPythonプログラムを実行します。なぜTCP接続が早すぎますか?

#!/usr/bin/python 

import socket 

host = '' 
port = 9000 

serversocket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
serversocket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 
serversocket.bind((host, port)) 
serversocket.listen(5) 

while True: 
    sock, address = serversocket.accept() 
    print("Connected ", address) 
    sock.settimeout(3600) 
    data = sock.recv(4096) 
    sock.close() 
    print("Disconnected") 

その後、私はtelnet XXX 9000とそれに接続します。 5分後と数秒後に接続が切断されます。 3600秒(私はsettimeoutの方法で設定した)の代わりに300秒(実際には304秒)後に壊れているのはなぜですか?

私はTCP接続を長時間実行する必要がありますが、ノンセンスのpingメッセージを送信する場合を除き、それを行う方法はありませんでした。他の方法はありますか?

+0

ソケットの両端は2つあります。反対側はそれを閉じましたか? –

+0

@FilipHaglund私はそうだと思います。 – porton

+0

Windowsでのtelnetのデフォルトタイムアウトは1時間と思われます。 BSDの値が見つかりません。 netcatを使ってみてください(デフォルトではタイムアウトしていません)。https://www.freebsd.org/cgi/man.cgi?nc –

答えて

1

との接続pingを実行するためにカーネルの設定:

sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPIDLE, 150) 
sock.setsockopt(socket.SOL_TCP, socket.TCP_KEEPINTVL, 150) 

は、問題を解決します。

この設定後、必要に応じて接続が切断されません。

関連する問題