BlackBoard (http://www.black-board.net/index.php)
- Design, Programmierung & Entwicklung (http://www.black-board.net/board.php?boardid=55)
-- Programmieren (http://www.black-board.net/board.php?boardid=4)
--- VB FTP-Verbindung herstellen (http://www.black-board.net/thread.php?threadid=9656)


Geschrieben von kilone am 09.01.2003 um 16:08:

  FTP-Verbindung herstellen

Hallo @ all
wie kann ich mit Visual Basic eine Ferbindung zu einem ftp aufbauen und dort dann befehle ausführen?

Please help me!! unglücklich unglücklich



Geschrieben von Medusa am 09.01.2003 um 18:22:

 

am einfachsten geht das mit der winsock.
dafür gibts n Steuerelement in vb.
Such mal in google nach 'vb winsock' oder sowas Augenzwinkern



Geschrieben von kilone am 09.01.2003 um 19:04:

 

danke für den Tip werde ich mal versuchen Augenzwinkern



Geschrieben von Lektor am 01.02.2003 um 18:23:

 

@Medusa: Würdeste mir ftp mit winsock-Steuerelemt
mal näher bringen? Vielleicht hab ich ja in den letzten Jahren völlige Scheiße verscriptet und habs net einmal mitbekommen.

@kilone: Verwende das Internet-Übertragung-Steuerelement (Inet)!!

(Ich setz mal nen bissel VB-Scripting-Erfahrung vorraus, wenn de schon solch eine Frage stellst!)

1. Einstellen der AccessType-Eigenschaft auf einen gültigen Proxy-Server.

2.Aufrufen der OpenURL-Methode mit einer zulässigen URL.

3.Aufrufen der Execute-Methode mit einer zulässigen URL und einem zum Protokoll passenden Befehl.

4.Verwenden der GetChunk-Methode, um Daten aus dem Puffer abzurufen.

Die Einstellungen für AccessType
Konstante/ Wert/ Beschreibung

icUseDefault/0 / (Standard) Standardeinstellungen verwenden. Das Steuerelement verwendet, die in der Registrierung gefundenen, Standardeinstellungen für den Zugriff auf das Internet.

icDirect/1 / Direkt zum Internet. Das Steuerelement hat eine direkte Verbindung zum Internet.

icNamedProxy/ 2/ Benannter Proxy-Server. Weist das Steuerelement an, den in der Proxy-Eigenschaft festgelegten Proxy-Server zu verwenden.

OpenURL-Methode (Anweisungen Open, Put und Close)
Beispiel füllt ein Byte-Datenfeld mit dem Inhalt einer Binärdatei, bevor die Daten auf einem Datenträger gespeichert werden.

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Dim strURL As String
Dim bData() As Byte      ' Datenvariable
Dim intFile As Integer   ' FreeFile-Variable
strURL = _
"ftp://ftp.microsoft.com/Softlib/Softlib.exe"
intFile = FreeFile()      ' intFile auf eine
                        ' unbenutzte Datei setzen.
' Das Ergebnis der OpenURL-Methode wandert in das
' Byte-Datenfeld, und dieses wird dann auf Datenträger
' gespeichert.
bData() = Inet1.OpenURL(strURL, icByteArray)
Open "C:\Temp\Softlib.exe" For Binary Access Write _ 
As #intFile
Put #intFile, , bData()
Close #intFile


Execute-Methode mit dem FTP-Protokoll

Beispiele:
code:
1:
2:
Inet1.Execute "FTP://ftp.microsoft.com", _
"GET disclaimer.txt C:\Temp\Disclaimer.txt"


Execute , "CD docs\mydocs"
Execute , "CDUP"
Execute , "DELETE loesche.txt"
Execute , "DIR /mydocs"
Execute , _"GET getme.txt C:\gotme.txt"
Execute , "MKDIR /myDir"
Execute , _"PUT C:\putme.txt /putme.txt"
Execute , "PWD"
Execute , "QUIT"
Execute , _"RECV getme.txt C:\gotme.txt"
Execute , "RENAME old.txt new.txt"
Execute , "RMDIR oldDir"
Execute , _"SEND C:\putme.txt /putme.txt"
Execute "SIZE /largefile.txt"

Bsp.-Beschreibungen für execute brauch ich ja wohl nicht geben.
Falls CERN-Proxy-Server, nix mit direkte FTP-Verbindung mit der Execute-Methode,
OpenURL-Methode mit den Anweisungen Open, Put und Close verwenden.

GetChunk-Methode

Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
Private Sub Inet1_StateChanged(ByVal State As Integer)
   Dim vtData As Variant ' Datenvariable.
   Select Case State
   ' ... Andere Fälle werden nicht gezeigt.
   Case icResponseCompleted ' 12
      ' Eine zu beschreibende Datei öffnen.
      Open txtOperation For Binary Access _
      Write As #intFile

      ' Den ersten Datenblock abrufen. HINWEIS: geben Sie
      ' ein Byte-Datenfeld an (icByteArray), um eine 
      ' Binärdatei abzurufen.
      vtData = Inet1.GetChunk(1024, icString)

      Do While LenB(vtData) > 0
         Put #intFile, , vtData
         ' Nächsten Datenblock abrufen.
         vtData = Inet1.GetChunk(1024, icString)
      Loop
      Put #intFile, , vtData
      Close #intFile
   End Select
End Sub


Anmelden bei FTP-Servern

Beispiel:

code:
1:
2:
3:
4:
5:
6:
7:
With Inet1
   .URL = "ftp://ftp.eineFTPSite.com"
   .UserName = "John Smith"
   .Password = "mAuI&9$6"
   .Execute ,"DIR"   ' Gibt den Ordner zurück.
   .Execute ,"CLOSE" ' Die Verbindung schließen.
End With


Beispiel für das Herunterladen einer Datei mit FTP:

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
#include <afxinet.h>
//setzt voraus, daß Server- und Dateinamen initialisiert wurden
CInternetSession session("Meine FTP-Sitzung");
CFtpConnection* pConn = NULL;

pConn = session.GetFtpConnection(lpszServerName);
//Datei holen
if (!pConn->GetFile(pstrRemoteFile, pstrLocalFile))
   //display an error
delete pConn;
session.Close();


So keinen Bock mehr, hoffe Du hast jetzt mehr Durchblick!

Grüßle

Lektor

___________________
Wrecking Crew



Geschrieben von kilone am 02.02.2003 um 11:39:

 

ja hat mir sehr weiter geholfen dnake



Geschrieben von Medusa am 04.02.2003 um 18:29:

 

@Lektor:
Hab was dazu gelernt großes Grinsen
Theoretisch kann man das ja auch mit der winsock machen, was natürlich viel viel umständlicher wäre.
Ich hab in der Richtung noch net viel angestellt, aber das Inet-Dings da is ja dann ganz schön nützlich großes Grinsen



Geschrieben von Lektor am 07.02.2003 um 01:33:

 

Hi Medusa!

Und nun lernste noch etwas dazu.

Wozu benutze ich das Winsock-Steuerelement
Rest des Postings habe ich wieder gelöscht.

Deshalb muß Medusa mir jetzt ein TCP- oder UDP-Verbindungs-Grundlagen-Coding posten; oder eine Chat-Anwendung.
(Man bin ich heute wieder scheiße; aber Winsock-Steuerelement for remote-protocoll!)

Grüßle

Lektor

___________________
Wrecking Crew



Geschrieben von Medusa am 07.02.2003 um 15:55:

 

Zitat:
Original von Lektor
Deshalb muß Medusa mir jetzt ein TCP- oder UDP-Verbindungs-Grundlagen-Coding posten; oder eine Chat-Anwendung.

Weshalb?

Warum soll das net gehen?
Daten senden, Daten empfangen. Mehr braucht man doch net. Nur wie gesagt sind ja bei dem anderen Steuerelement wichtige Funktionen schon "vorprogrammiert", also einfach "log mich ein mit name xxx und pass yyy", und fertig.

Das is doch einfach wie html mit notepad und html mit frontpage. Naja, net ganz, aber so ähnlich



Geschrieben von Lektor am 20.02.2003 um 21:35:

 

@Medusa: Ich will Dir ja auch gar nicht auf die Füße treten.

Es gibt in god old germany nur vier Programmierer(Skripter), mit denen ich mich auf irgendwelche Diskussionen einlasse, Du gehörst mit Sicherheit nicht dazu; sorry!

Was will ich erreichen, mit welchem Aufwand?

Das Winsock-Steuerelement benutze ich für Lösungen für den einfachen Zugriff auf TCP- und UDP-Netzwerkdienste. Mit Access, VB, V C++ und V FoxPro.
Mit der Funktion des Winsock-API auf Systemebene kann ich natürlich zum Remote-Computer eine Verbindung herstellen und in beide Richtungen Daten austauschen, Recht haste da.

So nun schauen wir uns mal ein Code-Beispiel zur Umsetzung des Probs an, die uns zeigen wird, daß hier der Weg zu einer reibungslosen, unproblematischen FTP-Lösung nur schwer (umständlich) zu realisieren ist.

TCP-Server

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
Private Sub Form_Load()
' Die LocalPort-Eigenschaft auf eine ganze
' Zahl setzen. Dann die Listen-Methode aufrufen.
tcpServer.LocalPort = 1001
tcpServer.Listen 
frmClient.Show ' Das Client-Formular anzeigen.
End Sub

Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
' Prüfen, ob die State-Eigenschaft des
' Steuerelements den Wert Closed (geschlossen)
' hat. Falls nicht, die Verbindung schließen,
' bevor die neue Verbindung akzeptiert wird.
If tcpServer.State <> sckClosed Then _
tcpServer.Close
' Die Anforderung mit dem Parameter
' requestID akzeptieren.
tcpServer.Accept requestID
End Sub

Private Sub txtSendData_Change()
' Das Textfeld-Steuerelement namens txtSendData 
' enthält die zu sendenden Daten. Wenn der
' Benutzer im Textfeld eine Eingabe macht, wird
' die Zeichenfolge mit Hilfe der SendData-Methode 
' gesendet.
tcpServer.SendData txtSendData.Text
End Sub

Private Sub tcpServer_DataArrival _
(ByVal bytesTotal As Long)
' Eine Variable für die eingehenden Daten deklarieren. 
' Die GetData-Methode aufrufen, und die
' Text-Eigenschaft eines Textfelds namens 
' txtOutput mit den Daten belegen.
Dim strData As String
tcpServer.GetData strData
txtOutput.Text = strData
End Sub


TCP-Client

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Private Sub Form_Load()
   ' Das Winsock-Steuerelements heißt tcpClient.
   ' Hinweis: um einen Remote-Host anzugeben,
   ' können wir die IP-Adresse (z.B. "121.111.1.1")
   ' oder den Computernamen des Computers
   ' verwenden, wie hier von mir gezeigt.
   tcpClient.RemoteHost = "RemoteComputerName"
   tcpClient.RemotePort = 1001
End Sub

Private Sub cmdConnect_Click()
   ' Die Connect-Methode aufrufen, um einen
   ' Verbindungsaufbau zu initiieren.
   tcpClient.Connect
End Sub

Private Sub txtSendData_Change()
   tcpClient.SendData txtSend.Text
End Sub

Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
   Dim strData As String
   tcpClient.GetData strData
   txtOutput.Text = strData
End Sub


Akzeptieren von mehreren Verbindungsanforderungen

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
Private intMax As Long

Private Sub Form_Load()
   intMax = 0
   sckServer(0).LocalPort = 1001
   sckServer(0).Listen
End Sub

Private Sub sckServer_ConnectionRequest _
(Index As Integer, ByVal requestID As Long)
   If Index = 0 Then
      intMax = intMax + 1
      Load sckServer(intMax)
      sckServer(intMax).LocalPort = 0
      sckServer(intMax).Accept requestID
      Load txtData(intMax)
   End If
End Sub



UDP-Peer

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
Private Sub Form_Load()
' Das Winsock-Steuerelement heißt udpPeerA
With udpPeerA
' WICHTIG: Vergess nicht, den Wert vom
' RemoteHost auf den Namen Deines Computers zu 
' setzen.
.RemoteHost= "PeerB" 
.RemotePort = 1001   ' Anschluß, zu dem
' verbunden werden soll.
.Bind 1002                ' An den lokalen
' Anschluß binden.
End With
frmPeerB.Show                 ' Zweites Formular zeigen.
End Sub

Private Sub txtSend_Change()
' Text senden, sobald er eingegeben wird.
udpPeerA.SendData txtSend.Text
End Sub

Private Sub udpPeerA_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
udpPeerA.GetData strData
txtOutput.Text = strData
End Sub


Zweiten UDP-Peer

code:
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
Private Sub Form_Load()
' Das Steuerelement heißt udpPeerB.
With udpPeerB
' WICHTIG: Vergesse nicht, den Wert von
' RemoteHost auf den Namen Deines Computers zu 
' setzen.
.RemoteHost= "PeerA"
.RemotePort = 1002    ' Anschluß, zu dem
' verbunden werden soll.
.Bind 1001                ' An den lokalen
' Anschluß binden.
End With
End Sub

Private Sub txtSend_Change()
' Text senden, sobald er eingegeben wird.
udpPeerB.SendData txtSend.Text
End Sub

Private Sub udpPeerB_DataArrival _
(ByVal bytesTotal As Long)
Dim strData As String
udpPeerB.GetData strData
txtOutput.Text = strData
End Sub


Desweiteren sollte man Unterschiede in der Bind-Methode bei TCP und UDP für RemoteHost; RemotePort und LocalPort nicht vergessen.

Warum EINFACH, wenns auch SCHWER geht?
@Medusa: Aber Du hast es ja vollkommen richtig erkannt, deshalb mach ich dir ja auch 0-Vorwurf; sollte halt nen Vergleich werden, mit Lernfaktor.
Deshalb hatte ich die Lösung gelöscht und dachte Du bist mal mit Coden dran.


PS: Wo ist eigentlich Euer Sinn für persönliche Freundlichkeit geblieben, Hallo; Gruß?

Grüßle

Lektor

____________________
Wrecking Crew


Forensoftware: Burning Board 2.3.6, entwickelt von WoltLab GmbH