Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: C++: Ladataan tiedosto, luetaan ja suoritetaan

Sivun loppuun

temu92 [30.07.2007 18:45:49]

#

Mitä tarttis käyttää että sais netistä ladattua tiedoston jossa on osote, se luettaisiin ja sitten suoritetaan? Eli pitäskö lataus tehä SDL_netillä ja miten suoritetaan? Ja dementtia ku vaivaa ni miten luetaan tiedostosta merkkijono? :D

hunajavohveli [31.07.2007 11:05:12]

#

Minkälainen tiedosto on kyseessä ja mitä tarkoitat sen suorittamisella? Olettaen, että käytät C:tä, voit käyttää merkkijonon lukemiseen tiedostosta fgets()-funktiota. Ensimmäisenä parametrina siis merkkijono, johon luetaan, toisena luettavien merkkien määrä ja kolmantena osoitin tiedostoon, josta luetaan.

temu92 [31.07.2007 13:06:05]

#

No, nettiin laitetaan tiedosto joka on tällainen

http://www.nettisivu.com

Sitten se lukee sen ja avaa osoitteen, että miten onnistuis? :P

hunajavohveli [31.07.2007 13:30:00]

#

SDL_netillä varmaankin onnistuu, en tiedä sen käytöstä tarkemmin. Mutta tuollaisesta osoitteesta saatava tiedosto on mitä todennäköisimmin HTML-dokumentti, ei "suoritettava" tiedosto. Tarkoitatko, että HTML-dokumentti pitäisi avata jollain selaimella vai renderöidä omalla ohjelmallasi?

temu92 [31.07.2007 13:57:00]

#

Siis ajetaan se osote sillai että se aukee oletusselaimeen

cbkoodi

execute "http://www.nettisivu.com"

miiro [31.07.2007 14:24:14]

#

Eli haluat http://www.nettisivu.com:n aukeavan oletusselaimessa? Siinä kaikki?

Vai haluatko ladata sen ensin kiintolevylle ja avata kiintolevyllä olevan version?

KeKimmo [31.07.2007 14:27:05]

#

Oletan, että tässä halutaan ensin ladata netistä tiedosto, jossa on osoite, ja sitten mennä tiedostossa olevaan osoitteeseen.

miiro [31.07.2007 14:33:59]

#

Ahaa, totta, asia taitaa olla juuri näin.

temu92 [31.07.2007 14:36:37]

#

No ihansama kunhan osoitteen sais auki :D

Eli voisko joku laittaa jotain linkkiä tai koodivinkkiä miten saadaan merkkijono netissä olevasta tiedostosta ja sitten se avataan?

aegis [31.07.2007 17:03:06]

#

Jos windowsilla oot niin ShellExecute() taitaa olla paras ratkaisu.

temu92 [31.07.2007 17:25:49]

#

Ny on ainaki suorittaminen tiedossa miten tehdään, sain toimimaan tällaisella pätkällä

#include <windows.h>
#include <shellapi.h>

int main(int argc, char *argv){
	ShellExecute(NULL, NULL, "http://www.google.com", NULL, NULL, SW_SHOWNORMAL);

	return 0;
}

Ja winxp mulla on, no mites sitten saatais se merkkijono netistä? :D

EDIT: Yritän säätää et sais sen osotteen stringillä tohon mut tulee valitus

C:\Dev-Cpp\****\main.cpp cannot convert `std::string*' to `const CHAR*' for argument `3' to `HINSTANCE__* ShellExecuteA(HWND__*, const CHAR*, const CHAR*, const CHAR*, const CHAR*, INT)'

Mitäs nyt

string address;
address = "http://www.google.com";

ShellExecute(NULL, NULL, address, NULL, NULL, SW_SHOWNORMAL);

zacura [31.07.2007 18:45:11]

#

Et voi antaa stringiä char pointerin sijasta, mutta muutapa tuo rivi muotoon:

ShellExecute(NULL, NULL, address.c_str(), NULL, NULL, SW_SHOWNORMAL);

tuo c_str() metodi palautta char pointterin stringin tekstiin.

temu92 [31.07.2007 19:45:50]

#

Hjuva toi toimii :D. Nyt vielä ku joku auttais sen että netistä sais sen osotteen.
Eli siis netissä tiedosto avaa.txt jossa on sisältönä:

http://www.google.com

Sitten se osoite pitäs sieltä nii saada tiedostosta ohjelmalle, miten?

T.M. [31.07.2007 19:57:13]

#

Kuulostaa jonkinlaiselta virukselta :O

temu92 [31.07.2007 21:04:20]

#

Ehkä, mut ei oo kuitenkaa :D

No mutta miten saan ladattua sen osotteen sieltä? :P Pitäskö ekaks ladata se tiedosto koneelle ja sitten lukee se, vai onnistuuko se suoraan netistä??

temu92 [01.08.2007 00:07:41]

#

Joku pistäis linkkiä tai vinkkiä?

Metabolix [01.08.2007 03:31:11]

#

Yhdistä SDL_netillä palvelimeen, muotoile ja lähetä HTTP-pyyntö ja vastaanota vastaus, joka voi kyllä valitettavasti tulla ilkeästi palasiksi enkoodattunakin.

Pyynnön kannattaisi näyttää suunnilleen tältä (rivinvaihtona \r\n, lopussa kaksi):

GET /joku/tiedosto.txt HTTP/1.1
Host: joku.org
Connection: close

Ja tuo kannattaa lähettää palvelimelle joku.org porttiin 80. Vastaus voi olla näinkin tyly:

HTTP/1.1 200 OK
Date: Tue, 31 Jul 2007 17:58:46 GMT
Server: Apache
X-Powered-By: PHP/5.1.4
Connection: close
Transfer-Encoding: chunked
Content-Type: text

f
0123456789abcde
1d
0123456789abcdef0123456789abc

temu92 [01.08.2007 18:58:08]

#

Mikäs tässä on vikana? Se suostuu kyl kääntymään mut sdl heittää oman errorinsa
SDLNet_TCP_Open: Couldn't create socket

#include <stdio.h>

#include <SDL/SDL.h>
#include <SDL/SDL_net.h>

int main(int argc, char *argv[]){
	IPaddress ip;
	TCPsocket tcpsock;
	int port = 9999;

	if(SDLNet_ResolveHost(&ip,NULL,port)==-1) {
	   printf("SDLNet_ResolveHost: %s\n", SDLNet_GetError());
	   exit(1);
	}
	tcpsock=SDLNet_TCP_Open(&ip);
	if(!tcpsock) {
	   printf("SDLNet_TCP_Open: %s\n", SDLNet_GetError());
	   exit(2);
	}

	printf("--Server online--\nPort %i\n", port);

	while(1){

	}

	return EXIT_SUCCESS;
}

Legu [01.08.2007 19:31:23]

#

Taitaa johtua siitä, ettei SDL:ää eikä SDL_net:iä ole alustettu. Tästä voisi olla apua.

temu92 [01.08.2007 19:36:01]

#

Nonii alkohan se pelittämään :D oon viel aika truenoob sdl:än käytös :D

Vielä jotain tarkempaa vinkkiä siihen miten lähetetään se HTTP-pyyntö ja vastaanoton suarittaminen? Siel on ne jotkut send ja recv funktiot, niillä?

temu92 [02.08.2007 18:37:40]

#

temu92 kirjoitti:

Vielä jotain tarkempaa vinkkiä siihen miten lähetetään se HTTP-pyyntö ja vastaanoton suarittaminen? Siel on ne jotkut send ja recv funktiot, niillä?

Niin?

temu92 [02.08.2007 22:39:45]

#

Nonii, sain itte kuitenki onnistumaan sen haun ja vastaukseks tuli

HTTP/1.1 200 OK
Date: Thu, 02 Aug 2007 19:31:56 GMT
Server: Apache/2.2.2 (Win32) DAV/2 mod_ssl/2.2.2 OpenSSL/0.9.8b mod_autoindex_color PHP/5.1.4
Last-Modified: Tue, 31 Jul 2007 21:56:56 GMT
ETag: "3a9b7-31-49b04248"
Accept-Ranges: bytes
Content-Length: 49
Connection: close
Content-Type: text/plain

http://www.google.com

Mites saan tuon viimesen rivin eli osotteen tosta erilleen?

Legu [03.08.2007 00:22:56]

#

#include <stdio.h>
#include <string.h>

int main ()
{
  /* vastaus on siis se vastaus sieltä palvelimelta */
  char vastaus[] = "HTTP\r\n"
		   "Headerit\r\n"
		   "on\r\n"
		   "tässä\r\n"
		   "\r\n"
		   "http://www.google.com"
		   "\r\n"; /* lopussa rivinvaihto? */
  /* osoitin paikkaan jossa tuo haluttu osoite sijaitsee */
  char * osote;
  /* etsitään kaksoisrivinvaihto */
  osote = strstr (vastaus,"\r\n\r\n");
  /* siirrytään rivinvaihtojen yli */
  osote += 4;
  /* otetaan lopusta rivinvaihto pois */
  osote[strlen(osote) - 2] = '\0';
  /* tulostus */
  printf("Osoite on %s.", osote);
  /* pois */
  return 0;
}

temu92 [03.08.2007 02:21:59]

#

Ny on vihdoinki kasassa juttu joka lataa netistä sen osotteen ja avaa sen, tosin tää ei toimi vielä kun yhen kerran eli siis se vetää suoraan while loopin läpi ja suorittaa avaamisen vaan kerran jos sitäkään

Toi on aika makee purkka, jos joku vois auttaa miten se vetäis sitä looppia kokoajan ja jos serverillä oleva osote vaihtuu se avaa osotteen.

#include <windows.h>
#include <shellapi.h>

#include <SDL\SDL.h>
#include <SDL\SDL_net.h>

#include <stdio.h>

#define MAXLEN 1024

int main(int c, char *v[]){
	IPaddress ip;
	TCPsocket tcpsock;
	int len, result, kerta, pois = 0;
	char *msg= "GET /sivuauki.txt HTTP/1.1\r\nHost: joku.org\r\nConnection: close\r\n\r\n";
	char rmsg[MAXLEN];
	char *v_osote;
	char *osote;

	char *server_address = "localhost";
	int	port = 80;

	if(SDL_Init(0)==-1) { // Alustetaan SDL
		exit(1);
	}
	if(SDLNet_Init()==-1) { // Alustetaan SDL_net
		exit(2);
	}

	if(SDLNet_ResolveHost(&ip,server_address,port)==-1) {
	   exit(3);
	}
	tcpsock=SDLNet_TCP_Open(&ip); // Soketti
	if(!tcpsock) {
	   exit(4);
	}

	while(!pois){
			len = strlen(msg) + 1;
			result = SDLNet_TCP_Send(tcpsock,msg,len); // Lähetetään pyyntö

			//char *rmsg = "";
			result = 0;
			result = SDLNet_TCP_Recv(tcpsock,rmsg,MAXLEN-1); // Vastaus
			if(result > 0) {
				printf("VIRHE: %s\n", SDLNet_GetError());
			    SDLNet_TCP_Close(tcpsock);
				exit(1);
			} else {
			    rmsg[result] = 0;

				//osote = "";
				osote = strstr (rmsg,"\r\n\r\n");
				osote += 4;
				osote[strlen(osote)] = '\0';

				printf("%s\n", osote);

				kerta++;
				if(kerta == 1){
				//	v_osote = osote;
				}
				if(osote != v_osote){
					if(osote == "@theend@") {
						pois=1;
					}else{
						ShellExecute(NULL, NULL, osote, NULL, NULL, SW_SHOWNORMAL);
						v_osote = osote;
					}
				}
			}
	}

	SDLNet_TCP_Close(tcpsock);

	return 0;
}

temu92 [04.08.2007 02:20:41]

#

Niin, osaako kukaan auttaa? :P (tää on auttamattomasti kohta tippumassa sivulle 2)

Metabolix [04.08.2007 02:36:21]

#

Jos vaikka siirtäisit myös yhdistämisen ja yhteyden katkaisemisen silmukan sisään, ja sitten voisit kehittää virhetilanteen selvittelyyn jotain muutakin kuin vain exit-komennon (et äskenkään kertonut, mistä syystä silmukka loppuu, mutta virhettä veikkaan). Sitten kannattaa varmaankin lisätä silmukan loppuun myös pieni viive (SDL_Delay), jotta ei mene ihan palvelimen spammaamiseksi.

Ei millään pahalla, mutta omatoiminen yrittäminenkin olisi kova sana. Kyllä kai nyt pienelläkin ohjelmointiymmärryksellä pitäisi tuo silmukka-ajatus keksiä.


Sivun alkuun

Vastaus

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

Tietoa sivustosta