0

次のTCP通信コード(サーバー側)を使用してタイムアウトなどを処理しています...クライアント側のソフトウェアを強制終了すると、例外が発生します(socket.error)が、クライアントPCからイーサネットケーブルを抜くと、 socket.timeout 例外が発生した場合、接続が切断されたことをどのように知ることができますか? socket.error数分後に例外が発生する可能性はありますか? 3 分間試してみましたが、socket.error 例外が発生しませんでした。

self.request.settimeout( 1 )
while 1:
        try:
            response = self.request.recv( buffSize )            
            if(response)
                ...response handler....       
            else:               
                ...disconnect handler....
        except socket.timeout :                  
            ...timeout handler...
        except socket.error:
            ...disconnect handler...
4

1 に答える 1

2

切断された接続をどれだけ迅速に検出するかによって異なります。数分待っても構わない場合は、TCP キープアライブをオンにすることができます ( https://www.rfc-editor.org/rfc/rfc1122#page-101 ):

import socket
self.request.setsockopt(socket.SOL_SOCKET, socket.SO_KEEPALIVE, 1)

TCP が使用する実際の時間間隔はオペレーティング システムに依存することに注意してください。

TCP キープアライブが提供するものよりも高速なものが必要な場合は、おそらくプロトコルに「ping」機能を導入する必要があります。これが意味することは、クライアントとサーバーが null 操作であるメッセージを定期的に交換することです。接続が有効であることをテストするだけです。

于 2012-12-13T15:55:27.660 に答える