Yo estoy creando un juego (o al menos lo intento) para la DS con conexión Wifi a internet (en concreto a un servidor con PHP). Así que me he pegado con la madre del cordero y su abuela por la cantidad de cosas raras que me han pasado.
Os dejo el código básico para conectarse a la Wifi, que por cierto vienen en los ejemplos de PaLib (esa misteriosa carpeta que se llama "PAlibExamples"). La forma más sencilla y básicota, que puede dar algunos fallos (a mí me funciona bien) es:
PA_InitWifi(); //Inicio las librerias Wifi
char *response = (char *) malloc(1000); //aquí guardo la respuesta
if (PA_ConnectWifiWFC()) { //Arranco el Wifi, aquí la DS empieza a parpadear
char url[256];
sprintf(url, "http://www.miserver.php?variable=valor");
PA_GetHTTP(response,url);
}
Wifi_DisconnectAP(); //cuando he terminado desconecto del servidor al que me he enchufado (www.miserver.php)
Wifi_DisableWifi(); //y apago el Wifi
PA_OutputText(0,1,1,response); //imprimo la respuesta del servidor
Eso es lo básico. Luego hay unas funciones que en teoría hacen los GET mucho mejor y sin tantos problemas, pero como a mí no me daba problema alguno el getHTTP pues lo he usado. Estas las he modificado algo yo, pero se basan en el ejemplo Leaderboard de Palib también. Dichas funciones son las siguientes:
int sendMsg(char *buffer, char *url) {
int sock;
char server[256];
char buffer3[256];
int pos = httpServer(server,url);
PA_InitSocket(&sock,server,80,PA_NONBLOCKING_TCP);
char buffer2[256];
sprintf(buffer2, "GET %s HTTP/1.0\r\nhost: %s\r\nAccept: */*\r\n\r\n",url+pos,server);
send(sock,buffer2,256,0);
strcpy(buffer,"");
while(buscarPalabra(buffer3,"\r\n\r\n",0) == -1) {
if (Pad.Newpress.Start) break;
memset(buffer3,0,sizeof(buffer3));
recv(sock,buffer3,256,0);
}
int poshtml = buscarPalabra(buffer3,"\r\n\r\n",0)+4;
strcat(buffer,buffer3+poshtml);
while(1) {
if (Pad.Newpress.Start) break;
memset(buffer3,0,sizeof(buffer3));
if(recv(sock,buffer3,256,0)<1) break;
strcat(buffer,buffer3);
}
if(sock) closesocket(sock);
return 1;
}
int httpServer(char *buffer, char *buffer2) {
int i,depart=0;
if(buscarPalabra(buffer2,"http://",0)!=-1)
depart+=7;
for(i = depart; buffer2[i] != '\0' && buffer2[i] != '/' && buffer2[i] != '\\'; i++) {
buffer[i-depart]=buffer2[i];
}
buffer[i-depart]='\0';
return i;
}
int buscarPalabra(char *mot1, char *mot2, int depart) {
unsigned int i,j,erreur=1;
for(i=depart;i<strlen(mot1);i++) {
if(mot1[i]==mot2[0]) {
erreur=0;
for(j=0;j<strlen(mot2);j++) {
if(mot2[j]!=mot1[i+j])
erreur=1;
}
if(erreur==0) return i;
}
}
return -1;
}
Estas en teoría son mejores por varias cosas. Eliminan las cabeceras de la respuesta del servidor (cabeceras HTML), que por lo general no te vuelven con el GetHTTP tampoco pero a veces se puede colar alguna cosa por ahí (nunca me ha pasado). Y además te permite cortar de cuajo el intento de conexión pulsando el botón Start. Pero bueno, que esto según necesidades.
Yo tras pegarme durante semanas con todo, encontré muchas cosas que me fallaban y las pude solventar prácticamente todas y al final me funcionaba igual de bien con el GetHTTP que con estas funciones, así que por no meter tanto código uso el getHTTP. Ahora el único problema que tengo es que la DS se cuelga aleatoriamente al conectar a la Wifi, pero a otros no les pasa por lo que creo que es cosa de la configuración de mi router. Si puedo lo miraré.
Intentaré leerme este hilo a menudo (y el foro de homebrew) para resolver dudas, que ya que me he tirado de los pelos resolviendo chorradas (chorradas que no se encuentran fácilmente) pues que al menos sirva para que al resto no le pase lo mismo.
PD: si alguien recibe caracteres vacíos (al imprimir la respuesta del servidor aparecen caracteres vacíos por ahí) ya descubrí lo que es, tras muuucho tiempo. Es un carácter de control, el número ASCII 1. Por lo tanto hay que borrarlos. Para ver el ASCII de un caracter -> (int)c. Ese ASCII debe ser >31 para que se corresponda con un caracter del teclado (los anteriores son caracteres de control).
PD2: también he hehco un programilla de DS que se conecta a un ordenador que tiene corriendo un servidor en Java, puedo poner un tutorial de esto también (tanto del servidor Java como del de DS).
PD3: cuando tenga mi juego terminado y pase a fase de pruebas lo pondré en el foro para que lo podáis probar y ponerme a parir por ser cutre xDDD (os mato
). Espero que no me surjan problemas insalvables y pueda terminarlo. Por cierto, se llama Anime Quest.