none
Windows CE kompatiblen FTP-Client Code RRS feed

  • Frage

  • Hallo,

    für eine Windows-CE Applikation (für ein Handheld-Terminal mit Windows Mobile 6.5, Compact Framework 3.5) will ich eine Kommunikationsmöglichkeit zu einem FTP-Server schaffen. Für's Desktop-Windows hab ich das auch schon mal gemacht über System.Net.FtpWebRequest, was recht einfach ging. Diesen Namespace gibt's aber dummerweise im Compact Framework nicht. Jetzt suche ich nach Alternativen. Mir fällt dazu ein:

    1) externes FTP-Client-Programm aufrufen

    2) das FTP-Protokoll auf Basis von System.Net.Sockets.TcpClient selbst implementieren

    3) API-Zugriffe auf WININET.DLL

    Lösung 1 ist mir ziemlich unsympathisch,  da sie mir nicht die benötigte Flexibilität für nicht-störende Aktionen im Hintergrund gibt. Lösung 2 & 3 könnten meine veranschlagten 2 Tage Entwicklungszeit stark überschreiten.

    Fällt jemanden noch eine andere Möglichkeit ein oder kennt jemand VBNet- oder C#-Code, der das Problem einfach lösbar macht?

    Gruß,

    Winfried

    Donnerstag, 26. September 2013 17:13

Antworten

  • Leider hat sich der bei CodePlex eingestellte OpenNetCF-FTP-Client als dermaßen unvollständig und fehlerhaft herausgestellt, dass ich den Weg wieder verlassen hab. Ärgerlich auch, dass ich damit schon einen langen Arbeitstag verbracht habe und immer tiefer in Protokollbesonderheiten von verschiedenen FTP-Server einsteigen musste. In der Source hapert es an allen möglichen Stellen: Nicht abgefangene Exceptions (z.B. wenn der Server die Verbindung vor dem Client beendet), fehlerhafte String-Auswertungen, die z.B. beim Kontakt mit Linux-Servern entweder zu Datenmüll oder zu nicht abgefangenen Exceptions führen, unvollständig implementierte Kommandos, grottenschlechtes Gesamthandling (Erkennung, ob eine Operation geklappt hat, nur über ständige Beobachtung der Events) usw.

    Letztlich hab ich dann doch das Ganze auf Basis der WININET.DLL neu geschrieben. Hat zwar wieder einen Tag gekostet, aber das läuft jetzt hervorragend.

    Gruß,

    Winfried

    • Als Antwort markiert WiWo Montag, 30. September 2013 05:56
    Sonntag, 29. September 2013 09:23

Alle Antworten

  • Hallo Winfried,

    es gibt einige FTP Libraries, die auch im Compact Framework nutzbar sind.

      http://ftp.codeplex.com/

      https://www.google.de/#q=compact+framework+ftp

      ...


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Donnerstag, 26. September 2013 18:45
    Moderator
  • Die Abwicklung über die API hatte ich jetzt zwar schon mal angefangen, da ich das schon mal vor Jahren in VFP-Code geschrieben habe, aber da würde mir jetzt noch erhebliche Fleißarbeit bevorstehen.

    Den OpenNetCF-Ftp-Client von Codeplex hab ich mir deshalb jetzt auch mal geholt. Der benutzt System.Net.Sockets und baut alle FTP-Befehle nach. Bei der Umsetzung auf VB.NET bin ich jedoch auf ein Problem gestoßen, da ich den Code dort nicht verstehe. An mehreren Stellen gibt es Konstrukte folgender Art:

                                if (ResponseReceived != null)
                                {
                                    foreach (FTPResponseHandler rh in ResponseReceived.GetInvocationList())
                                    {...

    wobei ResponseReceived ein Event vom Typ FTPResponseHandler ist, der wiederum so definiert ist:

    public delegate void FTPResponseHandler(FTP source, FTPResponse Response);

    damit bin ich schlicht überfordert und im umgesetzten VB.NET bekomme ich die Fehlermeldung, dass Events nicht direkt aufgerufen werden können, sondern RaiseEvent verwendet werden soll. Aber wie soll das in diesem Fall gehen?

    Gruß,

    Winfried

    Freitag, 27. September 2013 10:44
  • Hallo Winfried,

    warum in aller Welt willst Du den kompletten Code der Library übersetzen? Dafür gibt es keinerlei Notwendigkeit!? Du kannst die Assembly, egal in welcher .NET Sprache die geschrieben ist, in dein Projekt einbinden und dann aus VB.NET heraus verwenden.

    Wenn Du das aus einem mir unerfindlichen Grund dennoch machen willst, würde ich zuerst mal einen der verfügbaren Codekonverter nutzen, bspw.:

      http://converter.telerik.com/


    Gruß, Stefan
    Microsoft MVP - Visual Developer ASP/ASP.NET
    http://www.asp-solutions.de/ - Consulting, Development
    http://www.aspnetzone.de/ - ASP.NET Zone, die ASP.NET Community

    Freitag, 27. September 2013 11:04
    Moderator
  • Hallo Stefan,

    ich hab tatsächlich nicht dran gedacht, einfach ne Assembly aus dem C#-Code zu machen und einzubinden. Jetzt hab ich es gemacht und in meinem Desktop-Test-Programm lief's auch gleich, wenn auch aus irgendeinem Grund Exceptions ohne Inhalt geworfen werden, obwohl die Übertragung klappt.

    Zum VB.NET-Code: Natürlich hab ich mir das automatisch übersetzen lassen. Aber die Übersetzungsprogramme haben alle Probleme mit Events. Genau hier hakte das auch. Aber inzwischen hab ich rausgekriegt, was der C#-Code da machen sollte: Im Falle von mehreren Event-Handlern eine Exceptions in einem davon ignorieren und die anderen weiter durchklappern. Das ersetzt durch ein simples RaiseEvent, und alles läuft prima. Naja, ein paar kleine Änderungen hab ich trotzdem noch gemacht..

    Die Testzyklen bei CE-Programmierung sind immer recht langwierig. Mit Emulatoren zu arbeiten, hab ich inzwischen ganz aufgegeben; das bringt nix. Jetzt möglicherweise noch zusätzlich C#-Code zu warten, hab ich keine Lust, und jede zusätzliche DLL, die die Installationsleute einsetzen sollen, ist auch noch mal ne mögliche Fehlerquelle. Also bin ich ganz froh, das jetzt auf VB.NET zu haben.

    Gruß,

    Winfried

    Freitag, 27. September 2013 17:25
  • Leider hat sich der bei CodePlex eingestellte OpenNetCF-FTP-Client als dermaßen unvollständig und fehlerhaft herausgestellt, dass ich den Weg wieder verlassen hab. Ärgerlich auch, dass ich damit schon einen langen Arbeitstag verbracht habe und immer tiefer in Protokollbesonderheiten von verschiedenen FTP-Server einsteigen musste. In der Source hapert es an allen möglichen Stellen: Nicht abgefangene Exceptions (z.B. wenn der Server die Verbindung vor dem Client beendet), fehlerhafte String-Auswertungen, die z.B. beim Kontakt mit Linux-Servern entweder zu Datenmüll oder zu nicht abgefangenen Exceptions führen, unvollständig implementierte Kommandos, grottenschlechtes Gesamthandling (Erkennung, ob eine Operation geklappt hat, nur über ständige Beobachtung der Events) usw.

    Letztlich hab ich dann doch das Ganze auf Basis der WININET.DLL neu geschrieben. Hat zwar wieder einen Tag gekostet, aber das läuft jetzt hervorragend.

    Gruß,

    Winfried

    • Als Antwort markiert WiWo Montag, 30. September 2013 05:56
    Sonntag, 29. September 2013 09:23