Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: C/SDL_Net: FTP Put

Burton [17.02.2007 13:13:44]

#

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ä.)

Metabolix [17.02.2007 13:37:07]

#

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.

Burton [17.02.2007 16:50:18]

#

Kokeilin muuttaa getin putiksi vaihtamalla lähetettävät komennot palvelimelle, mutta se ei auttanut, koska sain tiedoston palvelimelle, mutten sisältöä siitä.

Metabolix [17.02.2007 22:42:02]

#

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.

Burton [17.02.2007 23:01:20]

#

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".

Metabolix [17.02.2007 23:23:52]

#

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.

tgunner [17.02.2007 23:45:39]

#

Oho! Tämä ongelmahan on jotenkin tuttu minulle jostain. Mistä olet kopioinut nuo koodit, Burton?

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta