Entwickler-Ecke

ASP.NET und Web - Problem beim FTP Zugriff


gordon65 - Di 12.01.10 19:39
Titel: Problem beim FTP Zugriff
also ich hab ein ftp zugriffsprogramm.
jetzt sagt mir aber c# das etwas veraltert ist:


C#-Quelltext
1:
        IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);                    


jetzt hab ich versucht das problem selber zu lösen:


C#-Quelltext
1:
        IPEndPoint(Dns.GetHostEntry(remoteHost).AddressList[0], remotePort);                    


nur das funktioniert nicht.



Hier ist das vollständige:


C#-Quelltext
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:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
52:
53:
54:
55:
56:
57:
public void login()
        {

        clientSocket = new 
        Socket(AddressFamily.InterNetwork,SocketType.Stream,ProtocolType.Tcp);
        IPEndPoint ep = new 
        IPEndPoint(Dns.Resolve(remoteHost).AddressList[0], remotePort);
        IPEndPoint(Dns.GetHostEntry(remoteHost).AddressList[0], remotePort);
        
        
        
        
        try
        {
        clientSocket.Connect(ep);
        }
        catch(Exception)
        {
        throw new IOException("Couldn't connect to remote server");
        }

        readReply();
        if(retValue != 220)
        {
        close();
        throw new IOException(reply.Substring(4));
        }
        if(debug)
        Console.WriteLine("USER "+remoteUser);

        sendCommand("USER "+remoteUser);

        if( !(retValue == 331 || retValue == 230) )
        {
        cleanup();
        throw new IOException(reply.Substring(4));
        }

        if( retValue != 230 )
        {
        if(debug)
        Console.WriteLine("PASS xxx");

        sendCommand("PASS "+remotePass);
        if( !(retValue == 230 || retValue == 202) )
        {
        cleanup();
        throw new IOException(reply.Substring(4));
        }
        }

        logined = true;
        Console.WriteLine("Connected to "+remoteHost);

        chdir(remotePath);

        }


JüTho - Di 12.01.10 20:08

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
nur das funktioniert nicht.

Immer diese ausführlichen Problembeschreibungen: Compiler- oder Laufzeitproblem? An welcher Stelle? Welche Fehlermeldung? Bei Exceptions möglichst ex.ToString, nicht ex.Message benutzen (das liefert mehr Informationen).

Zur Sache selbst kann ich nichts sagen mangels ASP-Kenntnissen.

Gruß Jürgen


gordon65 - Di 12.01.10 20:11

wenn man einfach mal zum test den befehl in visual studio eingegeben hätte wüste was er mir sagt

also in der fehlerliste steht:

Warnung 1 "System.Net.Dns.Resolve(string)" ist veraltet: "Resolve is obsoleted for this type, please use GetHostEntry instead. http://go.microsoft.com/fwlink/?linkid=14202" C:\Users\gordon65\AppData\Local\Temporary Projects\ftpconnect\http://FTP.cs 202 20 ftpconnect


Kha - Di 12.01.10 20:45

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
wenn man einfach mal zum test den befehl in visual studio eingegeben hätte wüste was er mir sagt
Scherzkeks ;) . Dass Resolve obsolete ist, haben wir bereits deinem ersten Posting entnommen. Es geht aber darum, was bei deinem korrigierten Code mit GetHostEntry schiefläuft - der, der nicht "funktioniert".


gordon65 - Di 12.01.10 21:02

Ich hab mein Fehler gefunden.

Danke für eure Zeit.



ok, nächstes Problem:

ich bekomme jetzt hier ein Fehler:

"Couldn't connect to remote server"


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        try
        {
        clientSocket.Connect(ep);
        
        }
        catch(Exception)
        {
        throw new IOException("Couldn't connect to remote server");
        }




Braucht ihr noch Informationen ??


ich hab es bei 2 ftp Servern probiert ... es klappte bei allen 2 nicht

mfg gordon


Greenberet - Mi 13.01.10 01:27

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:

ich bekomme jetzt hier ein Fehler:

"Couldn't connect to remote server"


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
        try
        {
        clientSocket.Connect(ep);
        
        }
        catch(Exception)
        {
        throw new IOException("Couldn't connect to remote server");
        }




Braucht ihr noch Informationen ??

user profile iconJüTho hat folgendes geschrieben Zum zitierten Posting springen:
user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
nur das funktioniert nicht.

Immer diese ausführlichen Problembeschreibungen: Compiler- oder Laufzeitproblem? An welcher Stelle? Welche Fehlermeldung? Bei Exceptions möglichst ex.ToString, nicht ex.Message benutzen (das liefert mehr Informationen).

was glaubst du...


danielf - Mi 13.01.10 10:01


C#-Quelltext
1:
2:
if (true
   return true;


gordon65 - Mi 13.01.10 21:45

sry leute .....

Hier ist die exception:

System.Net.Sockets.SocketException: Die angeforderte Adresse ist in diesem Kontext ungültig 213.202.225.68:0
bei System.Net.Sockets.Socket.DoConnet<EndPoint endPointSnapshot, SocketAddress socketAdress>
bei System.Net.Socket.Connect<EndPoint remoteEP>
bei ftpconnect.http://FTP.login<>; in C:\Users\gordon65\Documents\Visual Studio 2008\Projects\ftpconnect\ftpconnect\http://FTP.cs:Zeile 210.
Caught Error :Eine Anforderung zum Senden oder Empfangen von Daten wurde verhindert, da der Socket nicht verbunden ist und
<beim Sender über einen Datagrammsocket mit einem sendto-Aufruf> keine Adresse angegeben wurde


Kha - Mi 13.01.10 22:05

Port 0 ist möglicherweise eine schlechte Wahl...?

PS: Wenn es um FTP geht, warum dann keinen WebClient/FtpWebRequest?


gordon65 - Mi 13.01.10 22:13

ich hab den port 21 ... !!! (nicht 0)

und was ist der unterschied bei dem was ich hab und webClient/FtpWebRequest ??

und würd es vl. mit WebClient/FtpWebRequest funktionieren

vl.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            WebClient request = new WebClient();
            request.Credentials = new NetworkCredential("gordon_656449""****");

            byte[] fileData = request.DownloadData(@"ftp://gordon_656449.go.funpic.de/testfolder" + "/" + "MyFile.txt");

            FileStream file = File.Create(@"C:\test2" + "\\" + "MyFile.txt");

            file.Write(fileData, 0, fileData.Length);

            file.Close();


dann bekomm ich den Fehler;

System.Net.WebExceptions: Der Remoteserver hat einen Fehler zurückgegeben: (530) Nicht angemeldet.
bei System.Net.WebClient.DownloadDataInternal(Uri address, WebRequest&request)
bei System.Net.WebClient.DownloadData(Uri address)
bei Login2.Form1.ftpdownload2() in C:\Users\gordon65\Documents\Visual Studio 2008\Projects\Login2\Form1.cs Zeile 143.


Und das login geht !! ich habe die zugangsdaten richtig drinnern und ich hab es mit filezilla ausprobiert!


Kha - Do 14.01.10 00:44

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
ich hab den port 21 ... !!! (nicht 0)
Da ist die Fehlermeldung aber anderer Meinung: "213.202.225.68:0"

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
und was ist der unterschied bei dem was ich hab und webClient/FtpWebRequest ??
Das du dich nicht darum kümmern musst, was dir WebClient/FtpWebRequest an Arbeit abnimmt ;) .

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
System.Net.WebExceptions: Der Remoteserver hat einen Fehler zurückgegeben: (530) Nicht angemeldet.
Bei meinem FTP-Server funktioniert es so :nixweiss: .


gordon65 - Do 14.01.10 21:26

ok du hast recht.

Ich hab einen anderen ftp Server genommen und jetzt hat es geklappt!

Danke.

jetzt muss ich nur noch einen upload hinbekommen.


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
                WebClient request = new WebClient();
                request.Credentials = new NetworkCredential("****""*****");


                byte[] fileData = request.UploadData(@"ftp://web3.***-universe.net/files" + "/" + "MyFile.txt"):


                FileStream file = File.Create(@"C:\test2" + "\\" + "MyFile.txt");

                file.Write(fileData, 0, fileData.Length);
                file.Close();


jetzt bekomm ich ein paar compiler-fehler:

Fehler 5 Keine Überladung für die UploadData-Methode nimmt 1 Argumente an.

So müsste das ausschauen:

UploadData(Uri, Byte[])

was muss ich jetzt bei byte angeben .... (ich wüste wie groß die datei wäre, falls ich sowas brauche)


gordon65 - Sa 16.01.10 12:42

weis das den keiner ??


Kha - Sa 16.01.10 13:25

Huch, hast du deine Frage noch reineditiert?

Wie auch immer, du verwechselst gerade Upload und Download ;) .


gordon65 - Sa 16.01.10 20:19

ich brauche einen download UND einen upload ... den download hab ich hinbekommen ... aber den upload noch nicht ... siehe oben ...


Kha - So 17.01.10 13:58

Dann ist das wohl der Code für den Download, in den du einfach UploadData eingesetzt hast, das kann natürlich für Verwirrungen sorgen...

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:
was muss ich jetzt bei byte angeben .... (ich wüste wie groß die datei wäre, falls ich sowas brauche)
Das ist ein Byte-Array; so wie du beim Download die Datei als Byte-Array zurückbekommen hast, musst du sie beim Upload der Methode übergeben.

PS: Download/UploadFile ist dir schon aufgefallen ;) ?


gordon65 - So 17.01.10 18:43

und wenn ich einfach eine Datei uploaden will die mit der gedownloadeteten file überhaupt nichts zu tun hat ??

Edit:
als ich müste doch das hernehmen können vom download oder ?? und nur das eine auswechseln (UploadData)

und da dann die größe eingeben:

also ich müsste erst mal die Größe ermitteln:


C#-Quelltext
1:
2:
3:
4:
5:
            String filename = "datei.txt";
            System.IO.FileInfo file = null;
            file = new System.IO.FileInfo(filename);

            // und dann file.Length


funktioniert das ??

Edit2:

es funktoniert natürlich nicht.
Oder ich verstehe hier etwas falsch ?

Fehler 2 2-Argument: kann nicht von "long" in "byte[]" konvertiert werden. C:\Users\gordon\Documents\Visual Studio 2008\Projects\Login2\Login2\Form1.cs 168 114


ps: ich editiere öfters :) also ruhig mal öfter vorbeischauen :)


DareDevil - Di 19.01.10 11:45

user profile icongordon65 hat folgendes geschrieben Zum zitierten Posting springen:


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
            WebClient request = new WebClient();
            request.Credentials = new NetworkCredential("gordon_656449""****");

            byte[] fileData = request.DownloadData(@"ftp://gordon_656449.go.funpic.de/testfolder" + "/" + "MyFile.txt");

            FileStream file = File.Create(@"C:\test2" + "\\" + "MyFile.txt");

            file.Write(fileData, 0, fileData.Length);

            file.Close();


Wie du schon richtig erkannt hast braucht UploadData eine URI und ein ByteArray wobei DownloadData nur eine URI braucht und ein ByteArray als Rückgabewert hat.

Somit musst du erst den Inhalt der Datei die du Uploaden willst in ein ByteArray Umwandeln und dieses ByteArray an die UploadData Funktion übergeben.

Sieht dann ungefähr so aus


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
                WebClient request = new WebClient();
                request.Credentials = new NetworkCredential("****""*****");

                string fileName = @"C:\test2\" + "MyFile.txt";

                FileStream file = File.Create(fileName);

                BinaryReader br = new BinaryReader(file);
                long numBytes = new FileInfo(fileName).Length;
                byte[] fileData = br.ReadBytes((int)numBytes);

                request.UploadData(@"ftp://web3.***-universe.net/files" + "/" + "MyFile.txt", fileData):


so musste eigentlich passen

habe ich aber nicht getestet, daher keine ahnung ob wirklich alles davon funktioniert


gordon65 - Di 19.01.10 16:33

ja es funktioniert mehr oder weniger:

es gibt keinen compilerfehler oder Laufzeitfehler aber die Datei auf den Server hat 0 Bytes ... und wenn ich die Textdatei öffne steht (wie ich befürchtet habe) nichts drinnen


danielf - Di 19.01.10 16:41

Hi,

wieso verwendest du nicht die Methode UploadFile?

user profile iconDareDevil hat folgendes geschrieben Zum zitierten Posting springen:

Sieht dann ungefähr so aus

Ungefähr oder sieht so aus? Die Datei "C:\test2\MyFile.txt" hat auch Inhalt?

Gruß Daniel


gordon65 - Di 19.01.10 16:47

ja, die datei was ich uploaden will hat auch einen Inhalt


Kha - Di 19.01.10 18:37

Schau dir user profile iconDareDevils Code noch einmal an, besonders das File.Create solltest du überdenken.

user profile icondanielf hat folgendes geschrieben Zum zitierten Posting springen:
wieso verwendest du nicht die Methode UploadFile?
Ich hab's schon aufgegeben :P .


danielf - Di 19.01.10 18:43

:rofl:

Das Hilft ihm bestimmt ;)


gordon65 - Di 19.01.10 19:42

hääää,

irgendwie blick ich gar nicht mehr durch...

was passt jetzt nicht an file.Create

mmh. was ist mit

FileStream fs = File.OpenRead(inputfilepath);
byte[] buffer = new byte[fs.Length];

oder so ... ????


Kha - Di 19.01.10 20:18

Ja, darauf wollte ich hinaus :D .
Aber ich sehe gerade, dass user profile iconDareDevils Code viiel zu komplex ist, nimm einfach File.ReadAllBytes.

(oder UploadFile...)


gordon65 - Do 21.01.10 18:00

na also mit File.ReadAllBytes funktioniert es ohne probleme ....

Hier nochmal der funktionierende upload und download

Upload:

C#-Quelltext
1:
2:
3:
4:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential("*Benutzername*""*Passwort*");
byte[] fileData = File.ReadAllBytes("hallo.txt");
request.UploadData("ftp://*Server*/files" + "/" + "MyFile.txt", fileData);


warum so kompliziert?? funktioniert doch mit 4 zeilen :)

Download


C#-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
WebClient request = new WebClient();
request.Credentials = new NetworkCredential("*Benutzername*""*Passwort*");

byte[] fileData = request.DownloadData(@"ftp://*Server*/files" + "/" +     "MyFile.txt");

FileStream file = File.Create(@"C:\test2" + "\\" + "MyFile.txt");

file.Write(fileData, 0, fileData.Length);
file.Close();



im internet waren immer so komplizierte beispiele .... kein wunder warum ich da nicht mehr durchgestiegen bin.


ich bedankt mich erst mal (ganz besonders bei Kha):

Danke für alles ...


danielf - Do 21.01.10 18:18

Geht auch mit einer Zeile... und viel lesbarer...