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.
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..
Hvor mange points skal du have for at lave en løsning, hvor der kun sendes imellem server1-server2? ;)
Venlig hilsen, Martin.
Synes godt om
Ny brugerNybegynder
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.