2012-04-29 18 views
0

私はソケットを使ってPythonでクライアント/サーバーソフトウェアをプログラミングしています。ソケットPython接続

は、私は、特にTCP/IPおよびソケットのモデルのために、疑問を持っている:私は私のサーバー側のコードのこの例を使用しています

(Pythonで、サーバ側プログラム):

import socket 
# Create a TCP/IP socket 
server = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 

# Prevent from "address already in use" 
server.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

# Bind the socket to port 
server_address = ("localhost", 5000) 
server.bind(server_address) 

# Listen for connections 
server.listen(5) 

# Wait for on incomming connection 
read = connection.recv(1024) 
print "Received: ",read 

すべて、結構ですが、私はいくつかの概念の質問があります:

1)ENABためのベストプラクティスですどのようにこの通信は? CLIENTとSERVERプログラム間でTCP/IPのハートビートトラフィックをセットアップする必要がありますか?私は、私が戻ってきて、接続確立後に別のメッセージ(接続が確立されてから数分後に)を送信すると、サーバでトラフィック(アイドル)のないクライアントプログラムを残すことも見ました。それは正常な行動ですか?

2) TCP/IPスタックまたは「ソケットモジュール」でさえも、何らかの種類のTIMEOUT機能があります。私は誰が私の "タイムアウト"接続をPythonでソケットモジュールを使って失ったのですか?

すべてのためのTks!

答えて

2

TCPでは、接続を維持するためにハートビートは必要ありません。両方のエンドポイントが依然として健康である限り、接続は持続します。

ただし、ハートビートは障害を早期に検出するのに役立ちます。それ以外の場合は、接続がまだ生きているかどうかだけ、データを送信しようとしたとき(または相手側がデータを送信することを期待している)がわかります。多くの場合、これで十分です。しかし、IRCアプリケーションのように、クライアントがダウンした直後に知りたいものがあるので、それらがチャンネルから削除されたことを他の人に知らせることができます。

SO_KEEPALIVEソケットオプションを使用すると、自動的にハートビートパケットを送信できますが、私はそれに慣れていません。 This questionが役に立ちます。

タイムアウトの場合は、SO_RCVTIMEOSO_SNDTIMEOソケットオプションを使用します。詳細については、man 7 socketおよびPython socket documentationを参照してください。

+0

Tks Thomas、TCP/IPモデルはハートビートトラフィックを生成しません。エンドポイントが接続されている間、接続は開いたままです。 – StarkBR

+0

関連する質問へのリンクで更新されました。 – Thomas