Avatar billede spyrodrag Nybegynder
19. august 2004 - 12:33 Der er 7 kommentarer og
1 løsning

hjælp til FXP

Hej,

Jeg har brug for lidt hjælp til hvordan man FXP'er (dvs. sender en fil fra én FTP til en anden FTP.)

Venlig hilsen,
Martin.
Avatar billede arne_v Ekspert
19. august 2004 - 12:55 #1
Nu ved jeg ikke hvordan FXP adskilelr isg fra normal FTP.

Men vi nåede da et godt stykke vej her:

http://eksperten.dk/spm/525637
Avatar billede arne_v Ekspert
28. august 2004 - 18:57 #2
OK ?
Avatar billede arne_v Ekspert
04. september 2004 - 11:41 #3
Kommet videre ?
Avatar billede spyrodrag Nybegynder
06. september 2004 - 11:58 #4
nej...

kan du lave et eksempel på hvordan jeg sender en fil fra en ftp til en anden?

-martin
Avatar billede arne_v Ekspert
06. september 2004 - 12:05 #5
Det kan jeg vel nok.

Er det OK at der både er en EXE og en DLL ?
Avatar billede arne_v Ekspert
07. september 2004 - 09:31 #6
Der er flere måder:

1) download server1->client + upload client->server2

Der kan du bruge C# koden fra linket, builde til DLL og lade din VB.NET kode
lave download og upload.

2) streame server1->client->server2

Her er noget kode lavet udfra noget kode jeg har lavet til et andet spørgsmål:

Imports System
Imports System.IO
Imports System.Text
Imports System.Net.Sockets
Imports System.Threading

Public Class FtpClient
    Private ctrl As TcpClient
    Private ctrlstm As NetworkStream
    Private data As TcpClient
    Private datastm As NetworkStream

    Private Shared Sub Send(ByVal stm As NetworkStream, ByVal line As String)
        Dim b As Byte() = Encoding.Default.GetBytes(line)
        stm.Write(b, 0, b.Length)
    End Sub

    Private Shared Function Receive(ByVal stm As NetworkStream) As String
        Dim b(100000 - 1) As Byte
        Dim ix As Integer = 0
        Dim n As Integer
        While stm.DataAvailable
            n = stm.Read(b, ix, b.Length - ix)
            ix += n
        End While
        Return Encoding.Default.GetString(b, 0, ix)
    End Function

    Public Shared Function Command(ByVal stm As NetworkStream, ByVal cmd As String) As String
        Send(stm, cmd + Convert.ToChar(13) + Convert.ToChar(10))
        Thread.Sleep(50)
        Return Receive(stm)
    End Function

    Private Sub SetupData()
        Dim dataaddr As String = Command(ctrlstm, "PASV")
        Dim addrparts As String() = dataaddr.Split("()".ToCharArray)(1).Split(",".ToCharArray)
        Dim datahost As String = addrparts(0) + "." + addrparts(1) + "." + addrparts(2) + "." + addrparts(3)
        Dim dataport As Integer = Integer.Parse(addrparts(4)) * 256 + Integer.Parse(addrparts(5))
        data = New TcpClient (datahost, dataport)
        datastm = data.GetStream
    End Sub

    Public Sub New(ByVal host As String, ByVal username As String, ByVal password As String)
        ctrl = New TcpClient (host, 21)
        ctrlstm = ctrl.GetStream
        Command(ctrlstm, "USER " + username)
        Command(ctrlstm, "PASS " + password)
    End Sub

    Public Function Dir() As String
        SetupData
        Command(ctrlstm, "LIST")
        Dim res As String = Receive(datastm)
        Receive(ctrlstm)
        datastm.Close
        data.Close
        Return res
    End Function

    Public Function ShortDir() As String
        SetupData
        Command(ctrlstm, "NLST")
        Dim res As String = Receive(datastm)
        Receive(ctrlstm)
        datastm.Close
        data.Close
        Return res
    End Function

    Public Sub MkDir(ByVal dir As String)
        Command(ctrlstm, "MKD " + dir)
    End Sub

    Public Sub RmDir(ByVal dir As String)
        Command(ctrlstm, "RMD " + dir)
    End Sub

    Public Sub ChDir(ByVal dir As String)
        Command(ctrlstm, "CWD " + dir)
    End Sub

    Public Sub UpLoad(ByVal filename As String, ByVal binary As Boolean)
        If binary Then
            Command(ctrlstm, "TYPE I")
        Else
            Command(ctrlstm, "TYPE A")
        End If
        SetupData
        Command(ctrlstm, "STOR " + filename)
        Receive(ctrlstm)
        Dim f As FileStream = New FileStream (filename, FileMode.Open)
        Dim b(100000 - 1) As Byte
        Dim ix As Integer = 0
        Dim n As Integer
        While ix < f.Length
            n = f.Read(b, 0, b.Length)
            datastm.Write(b, 0, n)
            Thread.Sleep(100)
            ix += n
        End While
        f.Close
        datastm.Close
        data.Close
    End Sub

    Public Sub DownLoad(ByVal filename As String, ByVal binary As Boolean)
        If binary Then
            Command(ctrlstm, "TYPE I")
        Else
            Command(ctrlstm, "TYPE A")
        End If
        SetupData
        Command(ctrlstm, "RETR " + filename)
        Receive(ctrlstm)
        Dim f As FileStream = New FileStream (filename, FileMode.Create)
        Dim b(100000 - 1) As Byte
        Dim n As Integer
        While datastm.DataAvailable
            n = datastm.Read(b, 0, b.Length)
            f.Write(b, 0, n)
            Thread.Sleep(100)
        End While
        f.Close
        datastm.Close
        data.Close
    End Sub

    Public Function InitUpLoad(ByVal filename As String, ByVal binary As Boolean) As NetworkStream
        If binary Then
            Command(ctrlstm, "TYPE I")
        Else
            Command(ctrlstm, "TYPE A")
        End If
        SetupData
        Command(ctrlstm, "STOR " + filename)
        Receive(ctrlstm)
        Return datastm
    End Function
   
    Public Sub EndUpload
        datastm.Close
        data.Close
    End Sub

    Public Function InitDownLoad(ByVal filename As String, ByVal binary As Boolean) As NetworkStream
        If binary Then
            Command(ctrlstm, "TYPE I")
        Else
            Command(ctrlstm, "TYPE A")
        End If
        SetupData
        Command(ctrlstm, "RETR " + filename)
        Receive(ctrlstm)
        Return datastm
    End Function
   
    Public Sub EndDownload
        datastm.Close
        data.Close
    End Sub

    Public Sub Logout()
        Command(ctrlstm, "QUIT")
        ctrlstm.Close
        ctrl.Close
    End Sub
End Class

Public Class Fxp
    Public Shared Sub Transfer(fromhost As String, fromuser As String, frompass As String, _
                              path As String, filename As String, binary As Boolean, _
                              tohost As String, touser As String, topass As String)
        Dim fromcli As FtpClient = New FtpClient(fromhost, fromuser, frompass)
        Dim tocli As FtpClient = New FtpClient(tohost, touser, topass)
        fromcli.ChDir(path)
        tocli.ChDir(path)
        Dim istm As NetworkStream = fromcli.InitDownLoad(filename, binary)
        Dim ostm As NetworkStream = tocli.InitUpLoad("_" & filename, binary)
        Dim b(100000 - 1) As Byte
        Dim n As Integer
        While istm.DataAvailable
            n = istm.Read(b, 0, b.Length)
            ostm.Write(b, 0, n)
            Thread.Sleep(100)
        End While
        fromcli.EndDownLoad
        tocli.EndUpLoad
        fromcli.Logout
        tocli.Logout
    End Sub
End Class

Class TestClass
    Public Shared Sub Main(ByVal args As String())
        Fxp.Transfer("localhost", "anonymous", "arne@", ".", "z.zip", True, "localhost", "anonymous", "arne@")
    End Sub
End Class

3) triangle with control connection client-server1 og client-server2 og data
  connection server1-server2

Den er lidt tricky.

Men ovenstående kode kan også bruges som grundsten i den.
Avatar billede spyrodrag Nybegynder
07. september 2004 - 10:47 #7
Mange tak...
Idet at der vil gå noget tid, før jeg kan teste det (fordi jeg ikke har Internet hjemme for tiden), så får du dine velfortjente points nu..

Venlig hilsen,
Martin.
Avatar billede spyrodrag Nybegynder
12. oktober 2004 - 11:04 #8
Hej Arne.

Hvor mange points skal du have for at lave en løsning, hvor der kun sendes imellem server1-server2? ;)

Venlig hilsen,
Martin.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester