Hei. Löysin netistä koodin, joka tekee ftp-toimintoja, mutta vain vastaanottaa tiedostoja palvelimelta. Kuinka tähän voisi tehdä put-toiminnon?
(Mod. Edit. Onpa hyödyllistä tunkea se koodi tänne. Kieli C, verkkorajapinta SDL_net ja kaikille harvoille toiminnoille (lähinnä yhdistäminen ja get) oma funktionsa, siinä merkittävät tiedot sisällöstä.)
Lukemalla jostakin (vaikkapa osoitteesta http://www.faqs.org/rfcs/rfc959.html), kuinka operaatio toimii, ja tekemällä sille oman funktion samaan tapaan kuin tuossa oli Getille sun muille. Hyvä alku voisi olla lähteä siitä Getistä liikkeelle, muuttaa (kopioida) se Putiksi.
Kokeilin muuttaa getin putiksi vaihtamalla lähetettävät komennot palvelimelle, mutta se ei auttanut, koska sain tiedoston palvelimelle, mutten sisältöä siitä.
Varmaankin myös lähetit datan (ja oikeinkin) sen sijaan, että yritit vain vastaanottaa sitä?
Suosittelisin sellaista temppua, että vaikkapa telnetillä juttelisit yhdessä ikkunassa oikean ftp-palvelimen kanssa ja toisessa leikkisit palvelinta omalle ohjelmallesi tai vertailukohtana jollekin oikealle FTP-ohjelmalle. "Palvelinpuolen" ohjelmaksi on Windowsiinkin saatavilla netcat, tai toisaalta voit vaikka tehdä omankin pienen palvelimen, joka näyttää saamansa datan ja lähettää kirjoittamasi rivit. Sitten voisit aloittaa siirtoyritykset jollakin hyvin pienellä tekstitiedostolla ja tutkia, mitä verkossa liikkuu oikeilla ohjelmilla ja mitä omallasi.
Käytin tämmöistä koodia. Se on vain pikainen muokkaus get-funktiosta:
int Put(const char* remoteFile, TCPsocket s) { sprintf(buffer, FTP_COMMAND_PUT" %s"FTP_LINE_END, remoteFile); printf("Putting file:\n%s", buffer); if (Send(buffer, s)) { if (!Recv(s)) { return 0; } /* Gets the size of the file */ char *str = strstr(buffer, "("); if (!str) { return 0; } int len; int ret = sscanf(str+1, "%d", &len); /* Receives the stream*/ RecvFixed(sockData, len); printf("Response:\n%s\n", buffer); return 1; } return 0; }
, jossa #define FTP_COMMAND_PUT "STOR" ja #define FTP_LINE_END "\r\n".
No mutta vähän tolkkua tuohon. Lähetät palvelimelle tiedoston nimen, sitten odotat, että palvelin kertoisi sinulle tiedoston koon, ja yrität ladata siltä tiedoston? Äly hoi, älä jätä.
Lähetä tällaiset:
TYPE I PASV STOR koe.file
Vastausten pitäisi olla suunnilleen näin:
200 Type set to I 227 Entering Passive Mode (193,229,9,132,175,206) 150 Opening BINARY mode data connection for koe.file
Tästä siis selviää, että lähetysyhteys pitää muodostaa osoitteeseen 193.229.9.132 porttiin 256*175 + 206 = 45006. Sinne voit sitten lähettää tiedostosi.
Tämä kaikki selvisi kuvaamallani menetelmällä muutamassa minuutissa.
Oho! Tämä ongelmahan on jotenkin tuttu minulle jostain. Mistä olet kopioinut nuo koodit, Burton?
Aihe on jo aika vanha, joten et voi enää vastata siihen.