1

Python スクリプトで単純な HTTP リダイレクト サーバーに対してストレス テストを行っています。スクリプトは、ノンブロッキング ソケットを使用して epoll (エッジ トリガー モード) でセットアップされます。しかし、私はよくわからないことを観察しました。

1) connect() の処理中に epoll が ECONNREFUSED と ETIMEOUT errno の両方を取得する可能性があります。どちらもリモートサーバーが接続を受け入れられないことを示していませんか? それらはどのように異なりますか、クライアントはどのように違いを伝えますか?

2) EPOLLIN が epoll によって通知されると、socket.recv() は例外がスローされることなく (または C では errno) 空の文字列を返すことがあります。例外やエラーを取得することなくソケットを読み続けることができ、常に空の文字列を返します。何故ですか?

ありがとう、

4

1 に答える 1

1
  1. ECONNREFUSED接続がサーバーによって拒否されたことを通知しますが、ETIMEOUT接続の試行がタイムアウトしたことを通知します。つまり、接続試行に関する通知 (肯定的または否定的) がピアから受信されなかったことを示します。

  2. socket.recv()エラーなしで空の文字列を返すのは、単純に EOF 条件であり、C の空の読み取りに対応します。これは、相手側が接続を閉じるか、書き込みのためにシャットダウンしたときに発生します。EPOLLINEOF について知りたいため (そして、recvハングすることなくソケットから安全に取り出せるため)、EOF が発生したときに通知されるのは正常です。

于 2012-11-15T19:40:58.823 に答える