2017-12-01 16 views
0

私はそれがソケットを作成しようとしているループ内で実行されるように、特定のWebページに接続する接続、データを送信するためにTCPソケットを使用していますソケットを受信して​​閉じます。問題はランダム反復と特定のWebサイトでs.connect()がタイムアウトすることです。私はそうソケットプログラミング - s.connect()タイムアウト

s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1) 

は運で追加されたTCPのTIME_WAITについて読みました。各繰り返しの後に1秒間スリープしますが、まだ運がありません。 もう少し遅いネットワークではうまく動作しますが、高速なコードでは動作しないことに注意してください。

while(1) 
{time.sleep(1) 
s = socket.socket() #TCP socket creation 
s.settimeout(2) # 2 seconds for time-out which is more than needed 
s.connect() 
s.send(message) #which is a HTTP get request 
s.recv() # which is a HTTP response 
s.close()} 

私のコードルーチンの手順、ソケットの各メソッドが正しく実装されているが、次の、しかし、私は、接続にタイムアウトを取得する: iは、以下の擬似コードは、より多くのそれを明確にすることができると思います。私はサーバーが正常に機能していると確信しています。私はそれがTCP time_waitと何か関係があるかもしれないと思ったが、コメントは同意していないようだ。

答えて

1

サーバとのTCPハンドシェイクが特定の時間内に終了しないと、通常サーバが応答しないため時間内にs.setsockopt(socket.SOL_SOCKET、socket.SO_REUSEADDR、1のためには様々な理由、サーバがダウンしているように、DNSルックアップ中にサーバーの間違ったIPアドレスを取得し、サーバが過負荷など

があるかもしれません)

接続のクライアント側にこれを追加することはありません。それは、サーバーが待機することなく、再びリスナー・アドレスにバインドすることができますので、サーバーが再び速く利用可能であるため、問題がクラッシュしたサーバーによって引き起こされた場合は、サーバー側でこれを追加する

が役立ちます。しかし、これが本当にあなたが直面している問題であるかどうかはわかりません。

+0

REUSEADDR上の明確化のために感謝します。私が前に述べたようにループで接続しようとしたときに発生するので、出力は次のようになります:タイムアウト、RTT = 8ミリ秒での成功、RTT = 7ミリ秒での成功、 –

+0

@HamedTemsah明示的な接続タイムアウトを設定しましたか?再接続の間に接続を完全に閉じていますか? – smassey

+0

@HamedTemsah:これはサーバーがダウンしていてサーバーが過負荷になっていないことをどのように知っていますか?あなたはサーバーのコントロールを持っていますか?そして、あなたはおそらく非常に短い接続タイムアウトを設定しますか? –

関連する問題