質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

Q&A

1回答

6511閲覧

Tcp-KeepAliveパケットが発行されない

M_K

総合スコア13

FTP

FTP(File Transfer Protocol)は、ネットワークでのファイル転送を行うための通信プロトコルの1つである。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

TCP

TCP(Transmission Control Protocol)とは、トランスポート層のプロトコルで、コネクション型のデータサービスです。

0グッド

2クリップ

投稿2019/02/09 09:26

こんにちは。
標題の件について、皆様のお力を貸して頂ければと思います。

やりたい事

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側で何か設定が必要なのか、
些細な事でも結構ですので、助言をいただけると助かります。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

asm

2019/02/09 12:49

ファイル送信せずソケット開いた状態で5分待ってもkeepalive送信されませんか?
guest

回答1

0

ftpWebRequest.KeepAlive = false;
だと、転送が終わったらコントロールコネクションも閉じちゃうんじゃないでしょうか。まずはこれをtrueにしておく必要がある気がします。

https://docs.microsoft.com/en-us/dotnet/api/system.net.ftpwebrequest.keepalive?view=netframework-4.7.2#System_Net_FtpWebRequest_KeepAlive

投稿2019/02/09 10:09

kabao

総合スコア648

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問