2011-06-22 16 views
0

私たちは、Filezilla ClientとFilezilla Serverの間に2つのプロキシを持つ通信を行います。 2つのプロキシの間に2つのTCP接続があります。ソケットのライブを維持する方法

filezillaクライアント - > P1 - 2 ----- P2 - > filezillaサーバー。

私たちが得ている問題は、アップロードfilezillaクライアントがP1にすべてのデータを送信し、P1がP2にデータを送信することです。しかしP2 recv。速度はP1の送信速度ほど速くはありません。 P1はしばらくしてから接続を終了しますが、P2はまだP1からデータを取得しようとしているので、recvできなくなり、失敗します。

もう一方の端がデータを完全に受信するまで、soketを有効に保つ方法はありますか?

  1. 私は、異なるタイムアウトオプションを使用してLingerを試してみました。すべてのシナリオを処理するわけではありません。

  2. ソケットオプションキープアライブを設定しようとしましたが、同じ問題が引き続き発生します。

誰でも助けてください、または私に何か提案できますか?

+1

これは起こるべきではありません。 FTPは、いくつかのTCP接続に基づいています。 TCPにはフロー制御メカニズムが組み込まれています。エンドポイントはウィンドウサイズを調整して、リンクの一部に過負荷がかからないようにします。プロキシがデータを交換している限り、ソケットは削除しないでください。なぜP1のクライアントサブシステムはソケットを閉じますか?どのようなエラー/ステータスメッセージ/ログが生成されますか? –

+0

P1には2つのソケットがあります。たとえば、filezillaクライアント(sock1)で1つのソケットをアップロードし、P2(sock2)にデータを送信する1つのソケットです。 P1とP2の間の通信チャネルが破損し、ファイル送信が失敗する結果となります。 – Nidhi

答えて

1

P2は、接続が他の側から閉じられているという情報を受け取ると、接続を終了する前に残りのバイトをソケットから読み取る必要があります。このスレッドにあなたの貢献のためのすべての

+0

P2は、ソケットタイムアウトまでだけ残りのデータを読み込みます。私たちが5秒のタイムアウトでリンガーを与えた場合、P2はデータを5秒間読み取った後、接続を終了します。P1が送信したデータ全体を読み取ることはできません。 – Nidhi

+0

@Nidhi、自動接続を無効にしますシャットダウンはシステム(リンガー)によって実行されます。読み取るデータがなくなったときに、コード内のシャットダウンを実行します。 – Dialecticus

+0

P2レベルでソケットを開いたままにして、P2レベルでデータ全体を取得しようとしている場合、P1によって送信されたすべてのデータを消費したことをP2レベルで確認できます。データはP2レベルで残っていますが、ソケットはP1レベルで開いたままになり、結果的にファイルグリッド内のディレクトリ一覧の取得に失敗します(つまり、filezillaサーバー自体に接続できません)。 – Nidhi

0

おかげで、問題はシャットダウン機能を使用して解決されています....

よろしく Nidhi