0

ソケットを使用して 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)この通信を有効にするためのベスト プラクティスはどのようなものですか?? CLIENT プログラムと SERVER プログラムの間で TCP/IP のハートビート トラフィックをセットアップする必要がありますか?? クライアント プログラムをサーバーとのトラフィックなし (アイドル状態) のままにしておいても、戻ってきて別のメッセージを送信すると (接続が確立してから数分と数分後)、メッセージは引き続き送信されることがわかりました。それは正常な動作ですか?

2) TCP/IP スタックまたは「ソケット モジュール」でさえ、何らかの種類の TIMEOUT 機能を備えています?!?! socket モジュールを使用して Python で失われた「タイムアウト」接続を制御できるのは誰ですか??

ありがとうございます!

4

1 に答える 1

2

TCP では、接続を維持するためにハートビートは必要ありません。両方のエンドポイントが正常である限り、接続は維持されます。

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

ハートビート パケットを自動的に送信するためにソケット オプションを使用できるかもしれませんがSO_KEEPALIVE、私はその経験がありません。この質問は役に立つかもしれません。

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

于 2012-04-29T12:51:09.647 に答える