|
|
|
|
FTP-Verbindung herstellen |
kilone
Senior Member
Dabei seit: 13.09.2001
Beiträge: 320
|
|
|
09.01.2003 16:08 |
|
|
Medusa
Senior Member
Dabei seit: 10.09.2001
Beiträge: 356
Herkunft: ...von da, wo mein Haus wohnt...
|
|
am einfachsten geht das mit der winsock.
dafür gibts n Steuerelement in vb.
Such mal in google nach 'vb winsock' oder sowas
__________________ Grüßle, Medi
|
|
09.01.2003 18:22 |
|
|
kilone
Senior Member
Dabei seit: 13.09.2001
Beiträge: 320
Themenstarter
|
|
danke für den Tip werde ich mal versuchen
__________________ Klick mich fest
|
|
09.01.2003 19:04 |
|
|
Lektor
gesperrt
Dabei seit: 27.07.2001
Beiträge: 298
|
|
@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
|
|
01.02.2003 18:23 |
|
|
kilone
Senior Member
Dabei seit: 13.09.2001
Beiträge: 320
Themenstarter
|
|
|
02.02.2003 11:39 |
|
|
Medusa
Senior Member
Dabei seit: 10.09.2001
Beiträge: 356
Herkunft: ...von da, wo mein Haus wohnt...
|
|
@Lektor:
Hab was dazu gelernt
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
__________________ Grüßle, Medi
|
|
04.02.2003 18:29 |
|
|
Medusa
Senior Member
Dabei seit: 10.09.2001
Beiträge: 356
Herkunft: ...von da, wo mein Haus wohnt...
|
|
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
__________________ Grüßle, Medi
|
|
07.02.2003 15:55 |
|
|
Lektor
gesperrt
Dabei seit: 27.07.2001
Beiträge: 298
|
|
@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
Dieser Beitrag wurde 1 mal editiert, zum letzten Mal von Lektor: 22.02.2003 03:09.
|
|
20.02.2003 21:35 |
|
|
|
|
|
|