現在、当社の製品の 1 つにある FTP アップロード機能に関する顧客の問題をデバッグしようとしています。この機能により、顧客はファイル (< 1MB) を中央の FTP サーバーにアップロードして、さらに処理することができます。FTP クライアント コードは、VB.NET で社内で作成されました。
顧客は、300KB から 500KB の範囲のファイルをアップロードしようとすると、「接続がリモート ホストによって強制的に閉じられました」というエラーが表示されると報告しています。ただし、社内でこれをはるかに大きなファイル (比較的言えば)、つまり 3MB 以上でテストしましたが、このエラーは発生しませんでした。クライアントが同じ FTP ログオン資格情報を使用して接続するのと同じ FTP サーバーにアップロードしました。唯一の違いは、オフィスから行ったことです。
TCP プロトコルにはフロー制御が組み込まれていることを知っているので、1 回の Send 呼び出しで送信されるデータの量は問題にならないはずです。プロトコルは、サーバーの内部制限に合わせてそれ自体を調整するためです (私の記憶が正しければ. ..)
したがって、私が考えることができる唯一のことは、クライアントとルーターの間の中間ホストがクライアントを人為的にレート制限し、クライアントを切断していることです (512 バイトのチャンクでループ内のファイル データを送信します)。
これは、データを送信するために使用されるループです (buffer は、ファイル データを含むバイト配列です)。
For i = 0 To buffer.Length - 1 Step 512
mDataSocket.Send(buffer, i, 512, SocketFlags.None)
OnTransferStatus(i, buffer.Length)
Next
お客様の ISP (またはお客様のファイアウォール) が、クライアント コードが一定時間内に送信できるデータ量に人為的なレート制限を課している可能性はありますか? もしそうなら、この状況を処理する最善の方法は何ですか? 明らかな解決策は、ソケット レベルでこれを行う方法がない限り、送信ループに遅延を導入することだと思います。
ISP がクライアント接続を強制終了することでレート制限違反を処理するというのは、私には非常に奇妙に思えます。TCP/IP の内部フロー制御/スロットリング メカニズムに依存しないのはなぜですか?