- - PR -
FTP転送でのデータコネクション情報取得について
投稿者 | 投稿内容 | ||||
---|---|---|---|---|---|
|
投稿日時: 2007-06-05 23:21
いつもお世話になります。
Visual Basic 2005でソケットクラスを作成してFTP接続をしたいと考えているのですが、 FTPサーバーがPASVコマンドをサポートしていないことがわかり、 データコネクション情報(データを送信するためのソケットを作成する)を取得する方法がないか模索しております。 どなたか、わかる方がいらっしゃいましたらご教授願えないでしょうか。 http://support.microsoft.com/kb/832679/ja のコードをサンプルとしました。 宜しくお願いします。 | ||||
|
投稿日時: 2007-06-06 06:08
今日は
PASVコマンドを送る代わりに、クライアント側でデータ通信用portをリッスンとし、 そのポートをPORTコマンドでサーバーに連絡すれば良いと思います。 | ||||
|
投稿日時: 2007-06-06 09:13
早速のご回答ありがとうございます。
方法は分かったのですが、実際にどのようにコーディングするか サンプルなどございましたらご教授いただけないでしょうか。 http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22777&forum=7 を参考にしたのですが、 うまくデータを送信することができません。 宜しく御願いします。 | ||||
|
投稿日時: 2007-06-06 09:32
超能力者でないかぎりどううまくデータを送信できないかどんな実装しているかわからん。かけることはかいたほうがいい。 | ||||
|
投稿日時: 2007-06-06 09:37
FtpWebRequest/FtpWebResponse じゃ駄目なんでしょうか?
| ||||
|
投稿日時: 2007-06-06 09:48
実装したコードは以下の通りです。 http://support.microsoft.com/kb/832679/ja のサイト の CreateDataSocketの関数を修正し、 Private Function CreateDataSocket() As Socket Dim lipAddress As IPAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList(0) Dim testtcpListener As New TcpListener(lipAddress, 0) testtcpListener.Start() Dim lclsDataConIPEP As IPEndPoint = CType(testtcpListener.LocalEndpoint, IPEndPoint) SendCommand("PORT " & PortParam(lclsDataConIPEP.Port)) s = m_objClientSocket flag_bool = True Return s End Function Private Function PortParam(ByVal port As Integer) As String Dim localhost As IPHostEntry = Dns.GetHostEntry(Dns.GetHostName()) Dim IPAddress As IPAddress = localhost.AddressList(0) Dim address As String = IPAddress.ToString().Replace(".", ",") Dim i1 As Integer = port \ 256 Dim i2 As Integer = port Mod 256 Return address + "," + i1.ToString() + "," + i2.ToString() End Function という具合に修正し、 送信(UploadFile)でエラーとなってしまいます。 根本的なことが間違っているのかもしれませんが、 ご存知の方がいらっしゃいましたらご教授願います。 | ||||
|
投稿日時: 2007-06-06 10:28
MSのサンプルをみてませんが、 CreateDataSocket関数って データグラム用のsocketオブジェクトを返す関数ではないのですか? s = m_objClientSocket となってますが、m_objClientSocketってなんでしょう? コードに説明がないですが、 CreateDataSocket関数の戻り値としてstaticなメンバ変数返すって なんかへんですよ。 TCPListnerで接続をまって、 それによってつくられる データグラム用の接続を返せばいいんでしょう。 | ||||
|
投稿日時: 2007-06-06 13:23
データコネクション用のソケット作成関数を以下の様に
修正した所、 その後のファイル転送処理が成功したり、失敗したり するようになりました。 失敗した時のコマンド出力は 425 Can't open data connection. が出力されます。 何かコーディングで足りない部分があるのでしょうか? ご存知の方がいらっしゃいましたら宜しく御願いします。 (下記のPORT コマンド出力結果は、常時 500 Invalid PORT Command.と出力されるのが原因かもしれません) Private Function CreateDataSocket() As Socket Dim s As Socket Dim ep As IPEndPoint Dim lipAddress As IPAddress = Dns.GetHostEntry(Dns.GetHostName()).AddressList(0) m_Listener = New TcpListener(lipAddress, 0) m_Listener.Start() s = New Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp) ep = CType(m_Listener.LocalEndpoint, IPEndPoint) SendCommand(COMMAND_PORT & PortParam(ep.Port)) Try s.Connect(ep) Catch ex As Exception MessageString = m_sReply Throw New IOException("FTPサーバーへ接続できません。") flag_bool = False End Try flag_bool = True Return s End Function |