Mit Wii Quellcode einer Website anzeigen



  • Die Funktionen die du aufrufst (WPAD_Init() und VIDEO_Init() zum Beispiel) sind Funktionen aus dem WII-SDK, oder wohl eher (sehr viel wahrscheinlicher) der libogc, welche die funktionen des WII-SDKs nachbildet.

    Dementsprechend wirst du dich mal dannach erkundigen müssen.

    Mehr kann ich darüber eigentlich auch nicht sagen. Ich habe zwar schon für den Wii programmiert, aber halt mit dem Offiziellen SDK. Und ich selbst habe auf ganz anderer ebene(/Engine) programmiert. Und Netzwerk hatte unser Spiel auch nicht 😃


  • Administrator

    @Nordin,
    Verstehe ich das richtig, dass du kein C oder C++ kannst und dich bereits mit dem Wii SDK beschäftigst? Dann ein gut gemeinter Rat von mir:
    Lerne zuerst C++ und das auf dem PC mit einer ganz stink normalen Konsole (nicht die Spielkonsole ;)). C++ ist so schon komplex genug und man sollte es schon vernünftig können, bevor man sich an irgendwelche SDKs ranwagt. Empfohlene C++ Lernbücher:
    - C++ Primer
    - Thinking in C++ (auch gratis als PDF erhältlich, allerdings nur auf Englisch)

    Zu deinem eigentlichen Problem, kann ich dir allerdings nicht weiterhelfen. Kenne mich in Wii Programmierung nicht aus.

    Grüssli



  • @o_O
    Danke das könnte mir weiterhelfen.. ich schau mir das mal an.

    @Dravere
    Ja du verstehst richtig *g* allerdings bin ich kein ganzer Noob 😉
    Ich habe vor jahern mit VB programmiert und programmiere seit jahren komplexe PHP Applicationen... von daher versteh ich was ich da schreibe auch wenn ich hier und da nachschauen muss... aber man kann ja auch nicht alles wissen.

    Auf dem PC bekomme ich es ohne probleme hin auch einen eigenen Browser der auf webkit bassiert habe ich geschrieben (ein gaaanz simpler) aber nur zum verstehn.

    Muss sagen C++ ist schon komplexx aber wenn man es versteht doch sehr einfach.

    Was mir fehlt ist nur das Verständniss mit den Bibliotheken welche ich butrze und/oder brauche... aber vielleicht hilft mir das "WII-SDK" weiter.

    @o_O
    Für PHP gibt es eine Manuel wo man nachschlagen kann also zb. Funktionen suchen die dann anhand von Beispielen erklert werden. Gibt es sowas auch für C++?

    Danke für eure Auskünfte!



  • Für PHP gibt es eine Manuel wo

    Aha. Ein Manuel. 😃
    Ne so einen gibts in C++ nicht, aber es gibt eine Referenz. 😉
    http://www.cplusplus.com/reference/


  • Administrator

    @Nordin,
    Tut mir leid, aber PHP/VB und C++ sind völlig unterschiedliche Dinge! Ich bin auch von VB kommend auf C++ umgestiegen, ich rate dir dringend zu einem der genannten Bücher! C++ ist um vieles komplexer als die beiden Sprachen. Es endet katastrophal, wenn du dir kein fundiertes C++ Grundlagenwissen aneignest.

    Glaube einfach nicht, dass du mit dem Wissen aus PHP und VB auch C++ verstehen kannst. Das geht nicht oder nur für die asbolut einfachsten Dinge. Lies ein Buch zu C++, es kann schliesslich nicht schaden, also keine Angst 😉

    Über ein gutes C++ Buch lernst du dann auch die Standardbibliothek anzuwenden.

    Grüssli



  • @drakon
    lol... danke



  • Glaube einfach nicht, dass du mit dem Wissen aus PHP und VB auch C++ verstehen kannst. Das geht nicht oder nur für die asbolut einfachsten Dinge.

    😮 Also, ich sags mal so: Dank meiner guten PHP-Kentnisse verstehe ich was genau im Einzelnen wie und wo abläuft.

    In C++ ist es ähnlich, vor einer Woche konnte ich noch garkein C++ aber da ich weiß was funktionen, klassen, schleifen und so weiter sind... war es sehr einfach für mich...
    Da ich schon immer mal wissen wollte wie schnell man einen Browser bauen kann der auf (WebKit bassiert) war dies das erste was ich gemacht habe... ich habe wie schon erwähnt einen sehr simplen Browser gebaut der auf WebKit basiert. Ich denke also ihr braucht mich nicht ganz wie eine Anfänger behandeln. Ehr wie ein C++ Neuling der den unterschied zwischen der programmierung von Wii- und PC-programmen nicht versteht. Bin aber kein Anfänger was Programmieren angehnt.

    Lies ein Buch zu C++, es kann schliesslich nicht schaden, also keine Angst

    Ich habe keine Angst denn wie gesagt, bei PHP war es ähhnlich... vor 7 Jahren hat man mir in diversen Foren geraten ich solle erst PHP richtig lernen bevor ich dieses und jehnes machen kann (wie ich sowas leiden kann)... Eine Antwort auf meine Fragen habe ich so also nicht wirklich bekommen.

    Was habe ich also gemacht? Ich habe mir PHP-Bücher zugelegt, und versuch mit diesen Büchern PHP zu lernen... Aaaales viel zu umständlich!!! (kein Vorwurf:) Ein buch hilft mit sicherheit, ist aber viel zu kompliziert. Man muss stück für stück das Buch abschreiben... das dauert einfach viel zu lange.
    Mein Lösung war so: Ich habe an hand von tutoriels (Video und Text/ Youtube und Foren) versucht zu lernen... Habe mir den Code aus diversen fertigen Scripten kopiert und versucht zu verstehen was dort genau abläuft. Wenn ich eine Funktion nicht kannte, habe ich gegoogelt...

    Nach 3 Jahren habe ich mich damals dann selbständig gemacht und nun bin ich geschäftsführer einer gmbh die Web-Applicationen entwickelt 😉

    (An C++ wage ich mich nur hobbymäßig ran, wegen meiner Wii eben *g*, Programme für den PC brauche ich nicht... naja noch nicht... man weiß ja nie... aber das werde ich dann wohl ehr programmieren lassen *g*)

    Also, wer mir mehr Infos dazu geben kann wie ich mit einer Wii denn Quellcode einer webseite auslesen kann der soll bitte nicht zögern.
    Immer her mit den Infos! (Verbindung zum Netzwerk habe ich ja bereits hinbekommen, siehe Scripte erster Beitrag)

    Gruß Nordin



  • @nordin
    dein Quelltext in diesem Beitrag ist in C und nicht C++.
    Solltest du in deinen Projekten C++ nutzen wollen, solltest du einen kurzen Hinweis geben 😉

    Ich hab kein Ahnung wie das bei der Wii-API ist, aber viele API im PC-Bereich nutzen heute noch C; manch mal auch eine Mischung von C mit C++.

    Wie man an der Lesestatistik sehen kann ist das Interesse an diesem Beitrag gegeben 😉

    Dies ist keine Aufforderung an die Moderatoren das noch 3x oder öfter hin und her zu verschieben 😉

    MfG f.-th.



  • Hmm wer suche der Finde:

    Benutzen wir das SDK von Nintendo? Wurde es geleakt?
    Nein, wir benutzen das quelloffene, kostenlos erhältliche devkitPro und die libogc.

    http://wiibrew.org/wiki/DevkitPro

    Wenn mir jetzt noch jemand sagen kann wie man eventuell daten von einer internetseite holt bin ich glücklich *g*



  • dein Quelltext in diesem Beitrag ist in C und nicht C++

    Super! Danke, das ist mal ne Aussage!

    Solltest du in deinen Projekten C++ nutzen wollen, solltest du einen kurzen Hinweis geben.

    Wenn du mir sagen kannst ob und wie ich darin C++ in C nutzen kann wär ich dir dankbar villeicht ist es damit noch einfacher eine verbindung zum Internet herzustellen.

    So schaffe ich es vielleicht über socket... (in php fsockopen *g*)



  • Nordin schrieb:

    Wenn du mir sagen kannst ob und wie ich darin C++ in C nutzen kann wär ich dir dankbar villeicht ist es damit noch einfacher eine verbindung zum Internet herzustellen.

    Du solltest dich, bevor du da versuchst weiterzumachen wenigstens rudimentär mit C bzw. C++ beschäftigen. Dann wüsstest du nämlich dass man C++-Code nicht in C-Programmen verwenden kann. (Andersrum kann man es machen, sollte man aber nicht zu ausgiebig tun)



  • Du solltest dich, bevor du da versuchst weiterzumachen wenigstens rudimentär mit C bzw. C++ beschäftigen.

    Öhm mache ich doch...

    Dann wüsstest du nämlich dass man C++-Code nicht in C-Programmen verwenden kann. (Andersrum kann man es machen, sollte man aber nicht zu ausgiebig tun)

    Wusste ich ja nicht... darum habe ich ja schon in meinem ersten post gefragt:

    Ich wäre dankbar wenn mich jemand mal aufklären könnte was das für unterschiede sind? So wie ich mitbekommen habe muss das eine was mit windows zu tun haben oder mit .NET oder so. Ist das eine vielleicht C und das andere C++ ??
    Da ich aber nur für die Wii programmieren will und nicht für einen PC, kommt eins von beiden sicher nicht in frage oder sehe ich das falsch?

    f.-th. hat doch aber geschrieben:

    Solltest du in deinen Projekten C++ nutzen wollen, solltest du einen kurzen Hinweis geben

    Oder war das ehr ironisch gemeint?



  • Ich kann jetzt nur von der offiziellen Wii-SDK Seite an die Sache herangehen....

    Das Offizielle SDK ist eine Sammlung an C-Funktionen. Man mann aber durchaus mit c++ programmieren. Haben wir hier in der Firma auch gemacht.

    Du scheinst aber doch einige Sachen nicht so richtig im Blick zu haben. C++ ist (IMHO) deutlich komplexer, als z.B. PHP. Es gibt ehr möglichkeiten, und daher auch mehr Sachen, die man Falsch machen kann.
    Man muss deutlich mehr aufpassen (memoryleaks!) und muss da viel genauer arbeiten.

    Ich habe selbst schon bei einigen (auch größeren) PHP Projekten Mitgearbeitet. Von der Menge ist das natürlich auch viel, aber es is deutlich entspannter. Wenn man sich 'kaum' um Speicher/Datentypen kümmern muss is das schon ne Menge.

    Ich empfehle dir, mal durch die C++ FAQ lite zu gehen. Wenn du bei den Problemstellungen erkennst, was das Problem ist, DANN brauchst du kein Buch.
    Als gutes Beispiel kannst du dir mal Kapitel 18 durchlesen. Const correctness ist eine schon ziemlich wichtige Sache. Das sollte man können.

    Auch ich dachte, ich kann genug C++ bis ich am Wii gesessen habe und mal ein wirklich großes Projekt hatte. Da hab ich auch etliches noch nachgelesen. Obwohl ich da schon deutlich mehr von wusste, als du jetzt.

    Man lernt eben nie aus 😉



  • Du scheinst aber doch einige Sachen nicht so richtig im Blick zu haben. C++ ist (IMHO) deutlich komplexer, als z.B. PHP. Es gibt ehr möglichkeiten, und daher auch mehr Sachen, die man Falsch machen kann.
    Man muss deutlich mehr aufpassen (memoryleaks!) und muss da viel genauer arbeiten.

    Habe ich auch nicht abgestritten und ist mir auch bewusst... ich meinte eben nur das ich die scripte (oder tutorials) verstehe bzw. lesen kann und weis warum an welchewr stelle was benötigt wird... mir ist wie gesagt durchaus bewusst das c/c++ sehr komplex und aber auch entspanter ist... ich denke jeder hat ja mal angefangen mit c/c++ und wusste nicht alles gleich, vor dem problem stehe ich ja nun auch... nur dass es mir nicht so schwer fällt, da ich schon erfahrungen mit programmiersprachen habe. so da,ss soll es nun dazu gewesen sein...

    jetzt bitte nur noch wenn es um die wii geht 😉



  • Ich bin einen schritt weiter gekommen... habe ein folgendes Scrippt gefunden:

    main.cpp

    #include <stdio.h>
    #include <stdlib.h>
    #include <gccore.h>
    #include <wiiuse/wpad.h>
    #include <network.h>
    #include <string.h>
    #include <fat.h>
    /*Uncomment this part if you want to use debugging code */
    /*
    #define DEBUG 1
    #ifdef DEBUG
    #include <debug.h>
    #endif
    */
    
    /*
    Author: Ibrahim Awwal
    */
    static void *xfb = NULL;
    static GXRModeObj *rmode = NULL;
    static volatile u8 _reset = 0;
    const char *defaulturl = "example.com/index.html";
    
    /*
      This struct stores information about the HTTP response. For more information,
      see RFC 1945 http://www.w3.org/Protocols/rfc1945/rfc1945
     */
    struct httpresponse{
    	float version;
    	int response_code;
    	char *text;
    	char *date;
    	char *modified;
    	char *server;
    	size_t content_length;
    	char *content_type;
    	char *charset;
    
    };
    void init();
    int displayInetFile(const char *url);
    void printResponse(struct httpresponse response);
    /*
     * Downloads and displays a file from the internet.
     * Returns 0 on success, -1 on error.
     */
    
    int displayInetFile(const char *url){
    	struct httpresponse response;
    	char *filepath = strchr(url, '/');
    	char *hostname = strndup(url, filepath - url);
    	printf("hostname is %s and filepath is %s\n", hostname, filepath);
    	struct hostent *host = net_gethostbyname(hostname);/*gets the host information by domain name*/
    	struct sockaddr_in server;
    	s32 socket = net_socket(AF_INET, SOCK_STREAM, IPPROTO_IP);/*creates a socket*/
    	if(host == NULL){
    		printf("Oh crap, can't find %s\n", hostname);
    		return -1;
    	}
    	memset(&server, 0, sizeof(server));/*clears out the sockaddr_in structure, just saw this in an example and not sure if it's needed*/
    	server.sin_family = AF_INET;/*sets the socket type family to IPv4*/
    	server.sin_port = htons(80);/*uses port 80 for normal HTTP*/
    	memcpy(&server.sin_addr, host->h_addr_list[0], host->h_length);/*copies the host address into the sockaddr_in structure*/
    	if(net_connect(socket, (struct sockaddr *)&server, sizeof(server))){
    		printf("Darn, failed to connect\n");
    		return -1;
    	}
    	else
    		printf("Successfully connected!\n");
    	int len = strlen("GET  HTTP/1.0\r\n\r\n")+strlen(filepath);/*Find the length of the string needed to store the HTTP request*/
    	char *getstring = (char *)malloc(len);
    	sprintf(getstring,"GET %s HTTP/1.0\r\n\r\n", filepath);/*the minimum request necessary to get back a page, the format is GET file HTTP/version\r\n\r\n basically*/
    
    	int sent = net_write(socket, getstring, len);/*writes the request to the socket*/
    	printf("sent %d of %d bytes\n", sent, len);
    	int bufferlen = 1025;/*creates a buffer for receiving*/
    	char *buf = (char *)malloc(bufferlen);/*creates a buffer for receiving*/
    	unsigned int received = 0;
    	int read = 0;
    	response.text = (char *)malloc(sizeof(char)*32);
    	FILE *fp;
    	fp = fopen("sd:/temp.txt", "w");
    	char *line = (char *)malloc(bufferlen);
    	char *linebegin, *lineend;
    	bool dataStarted = false;
    	int headerlength = 0;
    	while((read = net_read(socket,buf, bufferlen-1))>0){/*while we have more data, read it into the buffer and print it out*/
    		buf[read]='\0';/*null terminate the amount read, not sure if necessary but better safe than sorry*/
    		linebegin = buf;
    		while((lineend = strchr(linebegin, '\n'))!=NULL){
    			memset(line, '\0', 1025);
    			strncpy(line, linebegin, lineend-linebegin);
    			if(!dataStarted){
    				if(!strncmp(line, "HTTP/", 5)){
    					sscanf(line, "HTTP/%f %d %s\n", &(response.version), &(response.response_code), response.text);
    				}else if(!strncmp(line, "Content-Length", 14)){
    					sscanf(line, "Content-Length: %d", &response.content_length);
    				}else if(!strncmp(line, "Content-Type", 12)){
    					char *space = strchr(line, ' ');
    					char *sc = strchr(space, ';');
    					char *eq = strchr(sc, '=');
    					response.content_type = strndup((space+1), sc-space-1);
    					response.charset = strndup((eq + 1), lineend - eq-1);
    				}else if(!strncmp(line, "Last-Modified", 13)){
    					char *space = strchr(line, ' ');
    					response.modified = strndup(space,lineend - space);
    				}else if(!strcmp(line, "\r")){
    					printf("end of http header\n");
    					dataStarted = true;
    					headerlength = lineend - buf + 1;
    				}
    			}
    			else{
    				printf("%s\n", line);
    				fprintf(fp, "%s\n", line);
    			}
    			linebegin = lineend + 1;
    		}
    		received+=read;
    	}
    	received-=headerlength;
    	fclose(fp);
    	printResponse(response);
    	if(read==0)
    		printf("Reached EOF\n");
    	if(read==-1)
    		printf("Read error\n");
    	net_close(socket);
    	if(received == response.content_length){
    		printf("Received %d bytes, everything seems to be in order.\n\n", received);
    	}else{
    		printf("Received %d of %d bytes, something went wrong.\n\n", received, response.content_length);
    		return -1;
    	}
    	return 0;
    }
    int main(int argc, char **argv) {
    	init();
    	displayInetFile(defaulturl);
    	/*the rest is from the template.c in libogc, press home to quit at this point*/
    	while(1) {
    		WPAD_ScanPads();
    		u32 pressed = WPAD_ButtonsDown(0);
    		if ( pressed & WPAD_BUTTON_HOME ) exit(0);
    		VIDEO_WaitVSync();
    	}
    
    	return 0;
    }
    
    void init(){
    	/*this stuff is all from the libogc wii template*/
    	VIDEO_Init();
    	WPAD_Init();
    	rmode = VIDEO_GetPreferredMode(NULL);
    	xfb = MEM_K0_TO_K1(SYS_AllocateFramebuffer(rmode));
    	console_init(xfb,20,20,rmode->fbWidth,rmode->xfbHeight,rmode->fbWidth*VI_DISPLAY_PIX_SZ);
    	VIDEO_Configure(rmode);
    	VIDEO_SetNextFramebuffer(xfb);
    	VIDEO_SetBlack(FALSE);
    	VIDEO_Flush();
    	VIDEO_WaitVSync();
    	if(rmode->viTVMode&VI_NON_INTERLACE) VIDEO_WaitVSync();
    	printf("\x1b[2;0H");
    
    	if (!fatInitDefault()) {
    		printf("fatInitDefault failure: terminating\n");
    	}
    
    	printf("Wii HTTP Test\n\nAttempting to initialize network\n");
    	/*tries to initialize network*/
    	char *myip = (char *)malloc(16*sizeof(char));
    	if(if_config(myip, NULL, NULL, true)){
    		printf("Failed to initialize network. Goodbye.");
    		exit(-1);
    	}
    	printf("Network initialized. Wii's IP is %s.\n", myip);
    
    	#ifdef DEBUG
    	DEBUG_Init(GDBSTUB_DEVICE_WIFI, 8001); // Port 8001 (use whatever you want)
    	_break();
    	#endif
    }
    
    void printResponse(struct httpresponse response){
    	printf("\tHTTP/%1.1f %d %s\n", response.version, response.response_code, response.text);
    	printf("\t%d bytes long\tModified: %s\n", response.content_length, response.modified);
    	printf("\tContent Type: %s; charset %s\n\n", response.content_type, response.charset);
    }
    

    Wenn ich das auf der wii ausführe, bekomme ich auch tatsächlich den Quellcode von example.com/index.html angezeigt... wenn ich aber diese URL ändere in z.b. ctxtra.org/wii/index.php zeigt er mir garnichts.. er schreibet:

    sent 0 of 0 bytes

    Warum ist das so? hat das mit bufferlen (zeile 77) oder mit memset (zeile 92) zu tun??

    Ach ja noch was, wenn ich ganz oben das DEBUG einkommentiere bekomme ich folgebndes Error:

    k:/wii-programmierung/worldwiideweb/source/main.cpp: In function 'void init()':
    k:/wii-programmierung/worldwiideweb/source/main.cpp:181: error: 'GDBSTUB_DEVICE_WIFI' was not declared in this scope

    (Öhm blöde frage, aber ist dieser Code jetzt C++ oder C weil die datei mit cpp endet.)



  • Nordin schrieb:

    Ach ja noch was, wenn ich ganz oben das DEBUG einkommentiere bekomme ich folgebndes Error:

    k:/wii-programmierung/worldwiideweb/source/main.cpp: In function 'void init()':
    k:/wii-programmierung/worldwiideweb/source/main.cpp:181: error: 'GDBSTUB_DEVICE_WIFI' was not declared in this scope

    Das scheint in der Datei <debug.h> deklariert zu sein. Wenn die Datei nicht inkludiert wird, gibt es einen Fehler.

    Nordin schrieb:

    (Öhm blöde frage, aber ist dieser Code jetzt C++ oder C weil die datei mit cpp endet.)

    Das ist C.
    Merkst du an "malloc", "fopen" und "printf".

    Ansonsten sehe ich auch nichts, was mir nach C++ aussieht.


  • Mod

    mad_martin schrieb:

    Nordin schrieb:

    Ach ja noch was, wenn ich ganz oben das DEBUG einkommentiere bekomme ich folgebndes Error:

    k:/wii-programmierung/worldwiideweb/source/main.cpp: In function 'void init()':
    k:/wii-programmierung/worldwiideweb/source/main.cpp:181: error: 'GDBSTUB_DEVICE_WIFI' was not declared in this scope

    Das scheint in der Datei <debug.h> deklariert zu sein. Wenn die Datei nicht inkludiert wird, gibt es einen Fehler.

    Da wird wohl eher irgendwo das DEBUG Symbol definiert, obwohl es ja oben auskommentiert wird. Möglicherweise durch irgendeine Compileroption oder einen der Header. Um dieses Symbol loszuwerden, müsstest du irgendwo nach den Includes schreiben:

    #ifdef DEBUG
    #undef DEBUG
    #endif
    

    Dann ist der DEBUG Modus mit Sicherheit aus.



  • Ich habe es jetzt so gemacht:

    #define DEBUG 1
    #ifdef DEBUG
    #include <debug.h>
    #undef DEBUG
    #endif
    

    ...und der Fehler ist weg.

    Nun bleibt nur noch:

    Nordin schrieb:

    Wenn ich das auf der wii ausführe, bekomme ich auch tatsächlich den Quellcode von example.com/index.html angezeigt... wenn ich aber diese URL ändere in z.b. ctxtra.org/wii/index.php zeigt er mir garnichts.. er schreibet:

    sent 0 of 0 bytes

    Warum ist das so? hat das mit bufferlen (zeile 77) oder mit memset (zeile 92) zu tun??

    Wenn ich da auch noch eine Lehrstunde für bekomme bin ich ersmal wieder glücklich *g*


Anmelden zum Antworten