Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Izvrsavanje FTP komandi iz C# programa...

[es] :: .NET :: Izvrsavanje FTP komandi iz C# programa...

[ Pregleda: 3013 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

tdusko

Član broj: 93380
Poruke: 1702
212.200.25.*



+768 Profil

icon Izvrsavanje FTP komandi iz C# programa...24.10.2008. u 14:39 - pre 188 meseci
Problem je sledeci. Pishem aplikaciju u c# koja treba preko ftp-a da poziva komande neke udaljene aplikacije. Ta aplikacija je pisana u ko zna cemu ali mislim da to nije bitno za ovu pricu. Uprosticu maksimalno problem i pitam vas: da li iz c# koda mogu da izvrsim neke ftp komande, na primer GET.

Mislim da je ovo sustina:

string cmd = "GET /QSYS/M88888.MBR C:/PLIST88888.TXT";
Byte[] cmdBytes = Encoding.ASCII.GetBytes((cmd + "\r\n").ToCharArray());
//send the command to the host
ftpSocket.Send(cmdBytes, cmdBytes.Length, 0);

Pre toga sam se uredno ulogovao slanjem komandi USSER i PASS.

Response koji dobijam kada pokusam da posaljem gornju komandu je "500 Subcommand GET not valid."

Kada komandu upisem u komandu liniju sve prolazi bez problema

Ima li neko iskustva sa ovim?
 
Odgovor na temu

Eurora3D Team
Nebojsa - Programer & Vodja tima
Beograd

Član broj: 120376
Poruke: 900
91.148.115.*



+7 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...24.10.2008. u 14:49 - pre 188 meseci
Mislim da ovaj ima iskustva sa FTP-om u C# http://www.codeproject.com/KB/IP/ftplib.aspx :)
poz
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...24.10.2008. u 15:25 - pre 188 meseci
Mislim da covek hoce da napravi svoju implementaciju FTP clienta.

Elem, ne mozes odmah posla authentikacije da upucas GET komandu, moras da uspostavis sekundarnu (data) konekciju u aktivnom ili pasivnom rezimu i da obavestis server sa PORT ili PASV komandom. U principu zbog kofiguracije firewallova sigurnije ti je da ides sa pasive modom.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.25.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...24.10.2008. u 16:05 - pre 188 meseci
Citat:
Mislim da covek hoce da napravi svoju implementaciju FTP clienta.

Elem, ne mozes odmah posla authentikacije da upucas GET komandu, moras da uspostavis sekundarnu (data) konekciju u aktivnom ili pasivnom rezimu i da obavestis server sa PORT ili PASV komandom. U principu zbog kofiguracije firewallova sigurnije ti je da ides sa pasive modom.


Problem je sto nikako ne mogu da se konektujem tim sekundarnim soketom. Koristim standardnu metodu kao i uvek. Kada dodje do poslednje linije (connect) tu pukne i kaze da ne moze da se konektuje. CUdno mi je i to da dobijam drugaciji response na komandu HELP kada je pozovem iz C#, a drugaciju kada je
pozovem iz DOS-a. Ta komanda vraca sve available komande i kada je pozovem iz C# nema komande GET.


Code:

private Socket OpenSocketForTransfer()
{
            ExecuteCMD("PASV");
            if (_statusCode != 227)
                {
                     throw new FtpException(result.Substring(4));
                    }
            
            
            int idx1 = result.IndexOf('(');
            int idx2 = result.IndexOf(')');
            
            string ipData = result.Substring((idx1 + 1), (idx2 - idx1) - 1);
            
            int[] msgSegments = new int[6];
            
            int msgLength = ipData.Length;
            int partCount = 0;
            string buffer = "";
            
            for (int i = 0; i < msgLength && partCount <= 6; i++)
            {
                
                char chr = char.Parse(ipData.Substring(i, 1));
                
                if (char.IsDigit(chr))
                {
                    //since its a number we add it to our buffer variable
                    buffer += chr;
                }
                
                else if (chr != ',')
                {
                
                    throw new FtpException("Malformed PASV result: " + result);
                }
                else
                {
                    
                    if (chr == ',' || i + 1 == msgLength)
                    {
                        try
                        {
                            msgSegments[partCount++] = int.Parse(buffer);
                            buffer = "";
                        }
                        
                        catch (Exception ex)
                        {
                            throw new FtpException("Malformed PASV result (not supported?): " + result, ex);
                        }
                    }
                }
            }

            string segment5 = ipData.Substring(ipData.Length - 3, 3);
            if (segment5.Contains(","))
            {
                int position = segment5.IndexOf(',');
                segment5 = segment5.Substring(position+1);
            }
            msgSegments[5] = int.Parse(segment5);
            
            string ipAddress = msgSegments[0] + "." + msgSegments[1] + "." + msgSegments[2] + "." + msgSegments[3];
            
            int port = (msgSegments[4] << 8) + msgSegments[5];
            Socket tranferSocket = null;
            IPEndPoint ipEndPoint = null;

            try
            {
            
                tranferSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                ipEndPoint = new IPEndPoint(Dns.GetHostEntry("Broan01").AddressList[0], port);
                tranferSocket.Connect(ipEndPoint);
            }
            catch (Exception ex)
            {
            
                if (tranferSocket != null && tranferSocket.Connected) tranferSocket.Close();
            
                throw new FtpException("Can't connect to remote server", ex);
            }

            return tranferSocket;
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...24.10.2008. u 16:37 - pre 188 meseci
Hmm, ja obicno volim da koristim Regex za cupanje ovakvih informacija, al dobro. :)


Al nevazno, ono sto mi je zaparalo oko je:

ipEndPoint = new IPEndPoint(Dns.GetHostEntry("Broan01").AddressList[0], port)
tranferSocket.Connect(ipEndPoint);

Broan01 (cak i da je to jedina masina na koju ces se ikad konektovati) moze da bude multihost i da ima vise IP adresa od kojih ce FTP server slusati samo na jednoj. Uvek se konektuj na IP adresu koja ti stigne u 227 odgovoru na PASV.

Drugo, da li je Broan01 iza firewall-a koji kontrolise inbound saobracaj? Ako jeste moras da ga konfigurises da slusa FTP command channel i otvori PASV port (bolji firewalli obicno imaju tu podrsku). Alternativno, na firewallu otvoris set portova (recimo 20100-20200) i konfigurises FTP server da koristi taj opseg portova za PASV mode.


Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.65.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...24.10.2008. u 18:56 - pre 188 meseci
Citat:

Al nevazno, ono sto mi je zaparalo oko je:

ipEndPoint = new IPEndPoint(Dns.GetHostEntry("Broan01").AddressList[0], port)
tranferSocket.Connect(ipEndPoint);


Ovo sigurno nije problem zato sto sam ovu simbolicku adresu stavio u trenucima ocaja dok sam pokusavao sve i svasta kako bih ga naterao da proradi. Izprva je tu stajala ip adresa dobijena kao response na PASV komandu.

Elem, posto vidim da si se zainteresovao da mi pomognes mozda ne bi bilo loshe da ti detaljnije malo objasnim sta ja u stvari hocu da postignem ovim sto radim. Fora je sto ja uopste nisam siguran da to mogu da uradim na nacin na koji pokusavam pa me mozda mozes usmeriti na drugu stranu.

Naime, aplikacija sa kojom pokusavam da se integrisem jeste neki IBM-ov ERP. On funkcionise tako sto mu se preko FTP-a salju neke komande sa parametrima na osnovu kojih on nesto uradi(recimo vadi neke podatke iz baze) i smesta to u neki txt fajl. Medjutim, ljudi koji rade sa tim softverom nikada nisu imali iskustva sa c#. Oni taj sortware koriste tako sto ukucavaju te komande u recimo command prompt-u. Prvo ide konektovanje na server, pa logovanje pa onda komanda za izvrsavanje nekog zadatka i onda ide GET kako bi prebacili taj fajl u direktorijum na lokalnoj mashini jer se ta aplikacija izvrsava na posebnoj mashini.

Moja aplikacija je ASP.NET sajt i ono sto ja trebam da uradim jeste da omogucim klijentu da kada se uloguje, klikne na neko dugme i da mu se prikaze katalog sa cenama. Kada on klikne na dugme ja trebam da uspostavim FTP konekciju, izvrsim komandu sa parametrom koji je ID tog klijenta, ta komanda ce za rezultat imati fajl sa cenama tako da na kraju trebam da download-ujem taj fajl. Kada ga download-ujem onda te podatke izcitam i prikazem klijentu.

Evo kako izgleda ta komanda:

QUOTE RCMD SUPLISTCL CSTNBR('10593')

U command promptu sve ide lako:

ftp> open NazivServera 21/ nakon ovoga dobijam poruku da sam konektovan
Username: Ussername/ nakon ovoga dobijam poruku da upisem pass
Password: Password/ nakon ovoga dobijam poruku da sam ulogovan
sada kucam komandu: QUOTE RCMD SUPLISTCL CSTNBR('10593') / posle par trenutaka dobijam poruku da je komanda uspesno izvrsena
sada ide GET GET /FOLDER/M88888.TXT C:/PLIST88888.TXT /nakon ovoga dobijam poruku da je fajl uspesno prebacen
QUIT

Moje razmiljanje je bilo ovako: Ako to tako ide u command promptu zasto ne bih isto to mogao kroz C# kod. Lepo kreiram soket, konektujem se na FTP server sa istim ussername i pass. i onda kazem liniju po liniju:

Code:

string cmd = "QUOTE RCMD SUPLISTCL CSTNBR('10593')";

Byte[] cmdBytes = Encoding.ASCII.GetBytes((msg + "\r\n").ToCharArray());
ftpSocket.Send(cmdBytes, cmdBytes.Length, 0);
//Sada ide onaj deo gde osluskujem response i ako je ok onda ide =>

string cmd = "GET /FOLDER/M88888.TXT C:/PLIST88888.TXT ";

Byte[] cmdBytes = Encoding.ASCII.GetBytes((msg + "\r\n").ToCharArray());
ftpSocket.Send(cmdBytes, cmdBytes.Length, 0);


Medjutim, sve ide lepo do dela kada pokusam da prosledim ove komande. Koju god da probam dobijem "500 Subcommand nazivKomande not valid".
 
Odgovor na temu

sallle
Sasa Ninkovic
GTECH
Beograd

Član broj: 146
Poruke: 480
91.148.95.*

ICQ: 20785904


+4 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 01:58 - pre 188 meseci
kolko me secanje sluzi, ftp protokol se sastoji iz 2 konekcije, jedna je za data transfer, druga za commands...cini mi se da data ide preko porta 20...
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.65.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 08:03 - pre 188 meseci
Ok, ajd da zanemarimo tu pricu oko data transfera.To dolazi na kraju. Pre toga trebam izvrsiti komandu koju sam naveo koja nema nikakve veze sa data transferom.

Kod mene u firmi niko nikada nije video nista slicno toj komandi, a kamoli da poziva tako nesto iz C# koda.

Da li je iko ikada video ovako nesto slicno i da li ima ideju kako to pozvati iz c# koda

Hvala
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 13:24 - pre 188 meseci
Ok, to je ocigledno neki derivat FTP protokola, ali ono sto je vazno je da ako radi kroz konzolni FTP, onda mora da moze da se uradi iz C#-a jer konzolni FTP client radi po standardnom FTP protokolu. Nema potrebe za diferencijacijom C#/konzolni klijent jer to nema veze sa FTP komandama.
FTP ne definise sve moguce komande koje mozes da izdas, tako da je sasvim ok imati custom komande kao sto je QUOTE RCMD (koju IBM koristi da ti omoguci da na serveru izvrsis CL komandu), do servera je kako ce da implementira komandu i dok god se za komandu ne koristi data channel i vrati se trocifreni status u skladu sa FTP protokolom ne moze biti nikakvih problema bez obzira na klijent implementaciju.

A sad sto se tice GET komande, ako ne navedes ni PORT ni PASV komandu po defaultu vazi aktivni mod i koristi se port 20/tcp kao data channel na IP adresi sa koje je zapoceta command channel sesija. Znaci pre nego izdas GET komandu moras da otvoris listener na portu 20/tcp (naravno tvoja IP adresa mora biti "vidljiva" sa FTP servera i inbound port 20 mora biti otvore na firewallu ako ga imas). Cim izdas GET server ce pokusati da se konektuje na tvoju IP adresu sa koje je dosla konekcija za command channel i ako nema ko da oslusne tu konekciju GET komanda ce propasti, sto se tebi verovatno desava.

Tvoj kod za slanje FTP komandi je ok, ono sto tebi fali je da ispostujes networking deo FTP protokola.
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.65.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 20:32 - pre 188 meseci
Citat:

A sad sto se tice GET komande, ako ne navedes ni PORT ni PASV komandu po defaultu vazi aktivni mod i koristi se port 20/tcp kao data channel na IP adresi sa koje je zapoceta command channel sesija. Znaci pre nego izdas GET komandu moras da otvoris listener na portu 20/tcp (naravno tvoja IP adresa mora biti "vidljiva" sa FTP servera i inbound port 20 mora biti otvore na firewallu ako ga imas). Cim izdas GET server ce pokusati da se konektuje na tvoju IP adresu sa koje je dosla konekcija za command channel i ako nema ko da oslusne tu konekciju GET komanda ce propasti, sto se tebi verovatno desava.


Ok, sto se tice GET komande sada mi je sve jasno kao dan. Hvala ti, puno si mi pomogao.

Medjutim, ovaj deo mi je jos malo maglovit

Citat:

Tvoj kod za slanje FTP komandi je ok, ono sto tebi fali je da ispostujes networking deo FTP protokola.


Ako sam te dobro razumeo, ti mislis da trebam da ispostujem neku proceduru nakon logovanja, a pre slanja QUOTE RCMD komande kako bih mogao da uradim:

Code:

string cmd = "QUOTE RCMD SUPLISTCL CSTNBR('10593')";

Byte[] cmdBytes = Encoding.ASCII.GetBytes((msg + "\r\n").ToCharArray());
ftpSocket.Send(cmdBytes, cmdBytes.Length, 0);


Da li si mislio na predhodno opisanu proceduru, odnosno da li mi i za izvrsavanje te komande treba poseban socket

ili predpostavljas da postoji neki protokol koji je potreban da bi se izvrsila ta komanda, za koji ne znamo.

Jos jednom, hvala
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 20:43 - pre 188 meseci
Citat:
Medjutim, ovaj deo mi je jos malo maglovit


Odnosi se na networking deo za GET komandu (manipulacija data channelom), QUOTE mozes da posaljes slobodno bez problema posto on ne koristi data channel. ALi koliko sam te ja razumeo tebi QUOTE i ne predstavlja problem, tebi puca GET, ne?
Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.65.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 21:00 - pre 188 meseci
Ne, ne mogu ni QUOTE da izvrsim ali sam GET uzeo kao primer kako bih neko lakse razumeo jer nisam mogao ni GET da izvrsim. Kasnije si mi objasnio zasto GET ne mogu da izvrsim pa sam ukapirao da sam lose postavio stvari.

Znaci, problem je jer ne mogu ni QUOTE da izvrsim. Kaze QUOT subcommand not valid

 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 21:25 - pre 188 meseci
Pa reci lepo sta je problem


Ovo mi ne deluje kao FTP problem, QUOTE ne koristi data channel ni za sta, to je jednostavno nacin da se posalje custom komanda ftp serveru (posto standardni FTP klijent ignorise sve sto ukucas iza QUOTE i ne radi nikakvu validaciju komande).
Jesi li siguran da je CL komanda SUPLISTCL CSTNBR('10593') ispravna? Koji error code dobijas nazad?

Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

mmix
Miljan Mitrović
Profesorkin muz
Passau, Deutschland

SuperModerator
Član broj: 17944
Poruke: 6042



+4631 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...25.10.2008. u 22:02 - pre 188 meseci
OK, kad si glup kaze se Do'h

Izvinjavam se na gluposti i zamlacivanju, sad sam se setio, QUOT uopste nije FTP komanda to je konzolna komanda FTP klijentu da ne zajebava nego da ono sto je iza posalje kao sirovu komandu. Znaci kad uradis "QUOTE TRT" u konzolnom FTP klijentu on serveru posalje samo "TRT"

Dakle, posto tvoj FTP klijent u C#-u ne analizira komande per se nema potrebe da ga upucujes da to ne radi . Samo posalji "RCMD SUPLISTCL CSTNBR('10593')" bez QUOTE i radice.



Sloba je za 12 godina promenio antropološki kod srpskog naroda. On je od jednog naroda koji je bio veseo, pomalo površan, od jednog naroda koji je bio znatiželjan, koji je voleo da vidi, da putuje, da upozna,
od naroda koji je bio kosmopolitski napravio narod koji je namršten, mrzovoljan, sumnjicav, zaplašen, narod koji se stalno nešto žali, kome je stalno neko kriv… - Z.Đinđić
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.65.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...26.10.2008. u 00:45 - pre 188 meseci
Citat:

Dakle, posto tvoj FTP klijent u C#-u ne analizira komande per se nema potrebe da ga upucujes da to ne radi . Samo posalji "RCMD SUPLISTCL CSTNBR('10593')" bez QUOTE i radice.


Nemam trenutno pristup tom udaljenom serveru gde hostujem tu aplikaciju tako da ne mogu da probam ovo odmah ali ako ovo proradi onda sam ti zahvalan i duzan mnooogo jer sam se poprilicno raspao zbog ovoga.

Ne zbog toga sto sam se nesto mnogo namucio vec zbog toga sto sam shefovima vec rekao da to radi jer sam dobio gomilu komandi koje sam trebao da proverim da li rade i to sam uradio u command promtu. U C# sam se konektovao na server i logovao bez problema i nakon toga me je mrzelo da probam sve komande jer sam smatrao da ne postoji razlog da ne rade i javio sam da je sve ok i oni su vec sa klijentom ugovorili sledecu fazu koja se oslanja na ovo sto ja u stvari NISAM uspeo da uradim. I zamisli sad da kazem: "E znate ono sto sam rekao da moze, u stvari ne moze. Ja sam se samo zezao".

Jbga, pocetnicka greska. Nikad ne smatraj da je nesto gotovo i da nesto radi dok definitivno se ne uveris da je gotovo i da radi.

Prvo sta cu u ponedljak ujutru da probam je ovo i odmah cu da javim ishod.
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.25.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...27.10.2008. u 09:18 - pre 188 meseci
@mmix

Probao sam ovo sto si mi rekao i proradilo je. Zanemeo sam kad sam video da radi. Stvarno je cudo koliko malo coveku treba da bi bio srecan :D. Hvala ti puno
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.25.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...28.11.2008. u 11:32 - pre 187 meseci
Evo mene ponovo, sa novim problemom.

Trenutna muka se odnosi na to da trebam da ftp-om dovucem odredjeni tekstualni fajl. Kada to uradim iz windows ftp klijenta (command line) uz pomoc get komande sve prodje ok. Medjutim, kada fajl dovlacim kroz moju c# aplikaciju uz pomoc soketa dobijem fajl sa kukama i kvakama.

Code:

 public void DownloadFile(string ftpFile, string localFile, Boolean resume)
        {
            if (!_isLoggedIn)
            {
               
                throw new FtpException("You need to log in before you can perform this operation");
            }

            IsBinary = true;
            
            Tracer.TraceMessage("Downloading file " + ftpFile + " from " + _ftpServer + "/" + _ftpPath, "FtpClient");
            
            if (localFile.Equals(""))
            {
                localFile = ftpFile;
            }
            
            FileStream output = null;
      
            if (!File.Exists(localFile))
            {
                output = File.Create(localFile);
            }
            else
            {
                
                output = new FileStream(localFile, FileMode.Open);
            }

           
            Socket dataSocket = OpenSocketForTransfer();
      
            long resumeOffset = 0;
      
            if (resume)
            {
                resumeOffset = output.Length;
                if (resumeOffset > 0)
                {
                    ExecuteCMD("REST " + resumeOffset);
                  
                    if (_statusCode != 350)
                    {
                        resumeOffset = 0;
                        Tracer.TraceMessage("Resuming not supported:" + result.Substring(4), "FtpClient");
                    }
                    else
                    {
                        Tracer.TraceMessage("Resuming at offset " + resumeOffset, "FtpClient");                  
                        output.Seek(resumeOffset, SeekOrigin.Begin);
                    }
                }
            }
            ExecuteCMD("RETR " + ftpFile);
            if (_statusCode != 150 && _statusCode != 125)
            {
                throw new FtpException(result.Substring(4));
            }
            DateTime timeout = DateTime.Now.AddSeconds(_timeOut);
            while (timeout > DateTime.Now)
            {
                bytes = dataSocket.Receive(buffer, buffer.Length, 0);
                output.Write(buffer, 0, bytes);              
                if (bytes <= 0)
                {
                    break;
                }
            }
            output.Close();
            if (dataSocket.Connected)
            {
                dataSocket.Close();
            }
            readResponse();         
            if (_statusCode != 226 && _statusCode != 250)
            {
                throw new FtpException(result.Substring(4));
            }
        }

     private Socket OpenSocketForTransfer()
        {
            ExecuteCMD("PASV");
            if (_statusCode != 227)
            {
                throw new FtpException(result.Substring(4));
            }
            Tracer.TraceMessage("Result: " + result, "");
            int idx1 = result.IndexOf('(');
            int idx2 = result.IndexOf(')');
            string ipData = result.Substring((idx1 + 1), (idx2 - idx1) - 1);
            Tracer.TraceMessage(ipData, "");
            int[] msgSegments = new int[6];
            int msgLength = ipData.Length;
            int partCount = 0;
            string buffer = "";
            for (int i = 0; i < msgLength && partCount <= 6; i++)
            {
                char chr = char.Parse(ipData.Substring(i, 1));
                if (char.IsDigit(chr))
                {
                    buffer += chr;
                }
                else if (chr != ',')
                {
                    throw new FtpException("Malformed PASV result: " + result);
                }
                else
                {
                    if (chr == ',' || i + 1 == msgLength)
                    {
                        try
                        {
                            msgSegments[partCount++] = int.Parse(buffer);
                            buffer = "";
                        }
                        //handle any exceptions thrown
                        catch (Exception ex)
                        {
                            throw new FtpException("Malformed PASV result (not supported?): " + result, ex);
                        }
                    }
                }
            }

            string segment5 = ipData.Substring(ipData.Length - 3, 3);
            if (segment5.Contains(","))
            {
                int position = segment5.IndexOf(',');
                segment5 = segment5.Substring(position + 1);
            }
            msgSegments[5] = int.Parse(segment5);
            string ipAddress = msgSegments[0] + "." + msgSegments[1] + "." + msgSegments[2] + "." + msgSegments[3];
            int port = (msgSegments[4] << 8) + msgSegments[5];
            Socket tranferSocket = null;
            IPEndPoint ipEndPoint = null;

            try
            {
                tranferSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
                ipEndPoint = new IPEndPoint(Dns.Resolve(ipAddress).AddressList[0], port);
                tranferSocket.Connect(ipEndPoint);
            }
            catch (Exception ex)
            {
                if (tranferSocket != null && tranferSocket.Connected) tranferSocket.Close();
                throw new FtpException("Can't connect to remote server", ex);
            }
            return tranferSocket;
        }



Da li to moze da bude zbog neke greske u kodu, mada ne bi trebalo jer isti ovaj kod vec koristim u drugim aplikacijama ili moze da bude nesto oko encodinga sto bih trebao da vodim racuna?

Fajlovi koje sam upload-ovao bi trebalo da budu isti. Radi se o jednom fajlu na serveru, a ova dva su nastala tako sto sam jedan dovuko kroz windows ftp klijent, a drugi kroz c# aplikaciju
Prikačeni fajlovi
 
Odgovor na temu

tdusko

Član broj: 93380
Poruke: 1702
212.200.25.*



+768 Profil

icon Re: Izvrsavanje FTP komandi iz C# programa...01.12.2008. u 13:24 - pre 187 meseci
nvm, resio sam problem. Trebalo je namestiti TYPE A, odnosno da se radi sa karakterima, a ne binarno i da se sa druge strane saceka sa ASCII enkodingom
 
Odgovor na temu

[es] :: .NET :: Izvrsavanje FTP komandi iz C# programa...

[ Pregleda: 3013 | Odgovora: 17 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.