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
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.
No, nettiin laitetaan tiedosto joka on tällainen
http://www.nettisivu.com
Sitten se lukee sen ja avaa osoitteen, että miten onnistuis? :P
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?
Siis ajetaan se osote sillai että se aukee oletusselaimeen
cbkoodi
execute "http://www.nettisivu.com"
Eli haluat http://www.nettisivu.com:n aukeavan oletusselaimessa? Siinä kaikki?
Vai haluatko ladata sen ensin kiintolevylle ja avata kiintolevyllä olevan version?
Oletan, että tässä halutaan ensin ladata netistä tiedosto, jossa on osoite, ja sitten mennä tiedostossa olevaan osoitteeseen.
Ahaa, totta, asia taitaa olla juuri näin.
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?
Jos windowsilla oot niin ShellExecute() taitaa olla paras ratkaisu.
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);
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.
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?
Kuulostaa jonkinlaiselta virukselta :O
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ä??
Joku pistäis linkkiä tai vinkkiä?
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
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; }
Taitaa johtua siitä, ettei SDL:ää eikä SDL_net:iä ole alustettu. Tästä voisi olla apua.
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 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?
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?
#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; }
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; }
Niin, osaako kukaan auttaa? :P (tää on auttamattomasti kohta tippumassa sivulle 2)
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ä.
Aihe on jo aika vanha, joten et voi enää vastata siihen.