2011-07-06 2 views
2

サーバソケットが正常にシャットダウンされたかどうかを判断しようとしています。Pythonのソケットの正常なシャットダウンの検出

プログラムがファイルを受信しました。送信中に何らかのエラーが発生した場合は、ファイルを削除する必要があります。

あなたの最初の提案は、クライアントにファイルの長さまたはファイルの転送が完了したことをサーバーに知らせるための終了データを送信させることです。
悲しいことに、私はクライアントを変更することはできません。raw TCP上にファイルをダンプするだけです。私はそれについて何もできません。だから「いいえ、でもあなたがそれを変えることができる」か「あなたのプロトコルに欠陥がある」というのではなく、プロトコルを書いていないので、それに対処しなければならない。

スクリプトはOSXとLinuxの両方で動作するので、epollは出力されます。

提案がありますか?

エラーが発生しても何のエラーも発生しなかったことを私は気にしません。

+0

ネットワークレベルの例外をキャッチしないとしますか? – Rahul

+1

ソケットはファイルの終わりを報告することによって正常に閉じます。何を知る必要がありますか? –

+0

はい、どうすればそれを読むことができますか。 –

答えて

0

私がする必要があったのは、ソケットタイムアウトを1分、recvコールがスローされ、1分後に例外が発生するように設定することでした。

1

データの送信が終了した場合、書き込みを行うためにソケットをシャットダウン(2)する必要があります。あなたのマルチプレックスループでは、ソケットが書き込みのためにシャットダウンされたかどうか、またはリモートエンドによってソケットが閉じられているかどうかをチェックすることができます(&の書き込み)。これは正常なシャットダウンであり、select/poll/kqueueなどを使用できます。

クライアントがそれをしないと、終了文字を送信せず、長さやチェックサムを送信しません。

プロトコルに関する詳細を削除する必要があります。クライアントは、ファイルを送信する目的だけでTCPソケットを開きますか?転送が完了したらソケットを閉じますか?

最悪の場合、ファイルの整合性をチェックする必要があります。実行時にファイルをチェックしたり、cronタブでクリーニングを試みたりすることができます。できない場合は、解決策を見つけるのは難しいでしょう。幸運...

+0

はい、ソケットが開かれ、ファイルが送信され、ソケットが正常に閉じられます。 javaでは、出力ストリームを閉じてread()が-1を返すのを待ちます。 –

+0

そして、ネットワークエラーなどが発生した場合はどうなりますか?私はソケットも閉じていると思います。それが優雅に閉じられているかどうかは言えません。したがって、最初にソケット上のWRITINGのためのshutdown()コールを使用して、書き込みを終了したことを相手に通知することをお勧めします。 Javaの正常なシャットダウンについては、http://download.oracle.com/javase/1.4.2/docs/api/java/net/Socket.html#shutdownOutput%28%29を参照してください。 – Aki

関連する問題