ポート 21 で着信要求をリッスンする Azure ワーカー ロールに TCP リスナーが実装されているためです。
Windows コマンド プロンプト (cmd.exe) から FTP に接続すると、接続が成功します。
ただし、600MB などの大きなファイルに対して PUT コマンドを発行すると、
ftp>> put localfile remotefile
ちょうど1分間のデータ転送の直後に、「ホストによって接続が閉じられました」というエラーで接続が切断されます。大量のデータ転送中は、FTPの制御接続がアイドル状態になるためです。
Azureロードバランサーが1分間アイドル状態の接続を終了するためだと思います。
接続を終了する Azure ロード バランサーであるか、ftp クライアントのタイムアウトを増やすことができる Windows のレジストリ設定であるか、またはアイドル状態の接続を強制終了するファイアウォール設定であるかに関係なく、入力します。
キープアライブ メッセージを tcpclient から tcplistener に送信するために次のコードを試しましたが、成功しませんでした。
int size = sizeof(UInt32);
UInt32 on = 1;
UInt32 keepAliveInterval = 10000; //Send a packet once every 10 seconds.
UInt32 retryInterval = 1000; //If no response, resend every second.
byte[] inArray = new byte[size * 3];
Array.Copy(BitConverter.GetBytes(on), 0, inArray, 0, size);
Array.Copy(BitConverter.GetBytes(keepAliveInterval), 0, inArray, size, size);
Array.Copy(BitConverter.GetBytes(retryInterval), 0, inArray, size * 2, size);
Connection.OutboundTcpClient.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.KeepAlive, True) Connection.OutboundTcpClient.Client.IOControl(IOControlCode.KeepAliveValues, inArray,null);