こんにちは。
標題の件について、皆様のお力を貸して頂ければと思います。
やりたい事
NAT越えの環境でFTP送信を行う必要があり、コントロールコネクションがNATタイムアウトに抵触しないように
接続維持をしながらFTP送信を行う機能を実装したいと考えています。
実装はC#、実行環境はWindows7となります。
検討した実現方法
上記を実現する為に、ServicePointManager.SetTcpKeepAliveを使用して、定期的にTcpのKeep-Aliveパケットを発行しながら
FTP送信を行う事を考えました。
ServicePointManager.SetTcpKeepAliveを設定してもTcp-KeepAliveパケットが発行されない
パケットキャプチャをしながら、PGのテストを行いましたが
FTPのファイル送信が完了してもKeepAliveパケットが発行されません。
(もちろんFTP送信には5分以上掛かっています。)
実装(抜粋)
// NATタイムアウト対策として、5分単位でTCP-KeepAliveを設定する。
ServicePointManager.SetTcpKeepAlive(true, 5 * 60 * 1000, 5 * 60 * 1000);
// FTP送信
NetworkCredential cre = new NetworkCredential("user","password");
string uri = "ftp://test-svr/file/test.zip"
Uri requestUri = new Uri(uri);
FtpWebRequest ftpWebRequest = (FtpWebRequest)WebRequest.Create(requestUri);
ftpWebRequest.Credentials = cre;
ftpWebRequest.Method = "STOR";
ftpWebRequest.KeepAlive = false;
ftpWebRequest.UseBinary = true;
ftpWebRequest.UsePassive = true;
ftpWebRequest.ReadWriteTimeout = -1;
ftpWebRequest.Timeout = -1;
Stream requestStream = ftpWebRequest.GetRequestStream();
string file = "C:\test.zip"
using (FileStream fileStream = new FileStream(file, FileMode.Open, FileAccess.Read))
{
byte[] array = new byte[1200];
for (;;)
{
int num = fileStream.Read(array, 0, array.Length);
if (num == 0)
{
break;
}
requestStream.Write(array, 0, num);
}
}
requestStream.Close();
FtpWebResponse ftpWebResponse = (FtpWebResponse)ftpWebRequest.GetResponse();
ftpWebResponse.Close();
####質問
KeepAliveパケットが発行されない原因が分からず苦慮してます。
そもそも私が勘違いしているのか、PG以外にもOS側で何か設定が必要なのか、
些細な事でも結構ですので、助言をいただけると助かります。