- PR -

FTP転送でのデータコネクション情報取得について

投稿者投稿内容
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-06-05 23:21
いつもお世話になります。
Visual Basic 2005でソケットクラスを作成してFTP接続をしたいと考えているのですが、
FTPサーバーがPASVコマンドをサポートしていないことがわかり、
データコネクション情報(データを送信するためのソケットを作成する)を取得する方法がないか模索しております。
どなたか、わかる方がいらっしゃいましたらご教授願えないでしょうか。
http://support.microsoft.com/kb/832679/ja
のコードをサンプルとしました。
宜しくお願いします。
rvmx
大ベテラン
会議室デビュー日: 2002/09/26
投稿数: 184
お住まい・勤務地: 愛媛県
投稿日時: 2007-06-06 06:08
今日は

PASVコマンドを送る代わりに、クライアント側でデータ通信用portをリッスンとし、
そのポートをPORTコマンドでサーバーに連絡すれば良いと思います。
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 2007-06-06 09:13
早速のご回答ありがとうございます。

方法は分かったのですが、実際にどのようにコーディングするか
サンプルなどございましたらご教授いただけないでしょうか。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22777&forum=7
を参考にしたのですが、
うまくデータを送信することができません。
宜しく御願いします。
ぶさいくろう
ぬし
会議室デビュー日: 2005/11/22
投稿数: 1232
お住まい・勤務地: 川崎市(は俺も含めてロクな人間が住んでないよw)
投稿日時: 2007-06-06 09:32
引用:

yamayamaさんの書き込み (2007-06-06 09:13) より:
早速のご回答ありがとうございます。

方法は分かったのですが、実際にどのようにコーディングするか
サンプルなどございましたらご教授いただけないでしょうか。

http://www.atmarkit.co.jp/bbs/phpBB/viewtopic.php?topic=22777&forum=7
を参考にしたのですが、
うまくデータを送信することができません。
宜しく御願いします。



超能力者でないかぎりどううまくデータを送信できないかどんな実装しているかわからん。かけることはかいたほうがいい。
Hongliang
ぬし
会議室デビュー日: 2004/12/25
投稿数: 576
投稿日時: 2007-06-06 09:37
FtpWebRequest/FtpWebResponse じゃ駄目なんでしょうか?
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 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)でエラーとなってしまいます。

根本的なことが間違っているのかもしれませんが、
ご存知の方がいらっしゃいましたらご教授願います。
れい
ぬし
会議室デビュー日: 2005/11/01
投稿数: 346
投稿日時: 2007-06-06 10:28
引用:

yamayamaさんの書き込み (2007-06-06 09:48) より:

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
という具合に修正し、



MSのサンプルをみてませんが、
CreateDataSocket関数って
データグラム用のsocketオブジェクトを返す関数ではないのですか?

s = m_objClientSocket

となってますが、m_objClientSocketってなんでしょう?
コードに説明がないですが、
CreateDataSocket関数の戻り値としてstaticなメンバ変数返すって
なんかへんですよ。

TCPListnerで接続をまって、
それによってつくられる
データグラム用の接続を返せばいいんでしょう。
yamayama
ベテラン
会議室デビュー日: 2006/02/10
投稿数: 68
投稿日時: 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

スキルアップ/キャリアアップ(JOB@IT)