[NDS] Problema al conectar DS a servidor en C++

Hola!!

Me he animado, por fin, a investigar un poco en lo que son los sockets y todo eso, y estoy intentando conectar la DS a un servidor hecho en c++ para linux (ubuntu 9.04), pero por más que lo intento, no consigo que la función Connect me funcione :S

Empecé haciendo un cliente también para linux, y con él no tengo ningún tipo de problema en conectarme con el servidor e incluso intercambiar datos, pero desde la DS me resulta imposible. Os dejo el código a ver si alguien puede ayudarme.


Main de la NDS:
#include <nds.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <fat.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <netdb.h>
#include <dswifi9.h>

#define PORT 40000 // puerto al que vamos a conectar
#define MAXDATASIZE 256
#define NORMAL_TCP 0
#define NONBLOCKING_TCP 1


int EGL_ConnectIP(int *sock, const char *IP, int port, int mode);
int EGL_InitWifi(int debug);


int main (int argc, char *argv[]){
   // Variables
   int numbytes;
   char buf[MAXDATASIZE]="hello from DS";

   // Inits
   consoleDemoInit();
   while (EGL_InitWifi(1) == 0);

   int sock;
   if ( EGL_ConnectIP(&sock, "127.0.0.1", PORT, NONBLOCKING_TCP) ){
   printf ("Conectado\n");
   }else{
   return 0;
   }     

   // Send
   printf ("Enviando: ");
   send( sock, buf, strlen(buf), 0 );
   printf ("enviado...\n");

   // Receive
   printf ("Recibiendo: ");
   while ((numbytes=recv(sock, buf, MAXDATASIZE-1, 0)) != 0) {
      if (numbytes > 0){
         buf[numbytes] = '\0';
      }   
   }
   printf("recibido...\n\n%s\n\n",buf);

   printf ("Cerrando socket: ");
   shutdown(sock,0);
   closesocket(sock);
   printf ("cerrado...");

   return 0;
}   


//--------------------------------------------------------------------------------------------------------------------------------------------

int EGL_ConnectIP(int *sock, const char *IP, int port, int mode){

//--------------------------------------------------------------------------------------------------------------------------------------------
   int i = 0;
   struct sockaddr_in client;
     

   *sock = socket(AF_INET,SOCK_STREAM,0);
   if(*sock == -1 ){
      printf("Error al crear socket\n");
      return 0;
   }else printf("Socket creado\n");

   client.sin_addr.s_addr = inet_addr(IP);
   client.sin_family = AF_INET;
   client.sin_port = htons(port);

   if ( mode == NORMAL_TCP ){ 
      i = 0;
      printf ("Ajustado a NORMAL TCP\n");
   }else if ( mode == NONBLOCKING_TCP ){
      i = 1;
      printf ("Ajustado a NONBLOCKING TCP\n");
   }   
   ioctl(*sock, FIONBIO, &i); // set blocking or non-blocking

   if ( connect(*sock, (struct sockaddr *) &client, sizeof(client)) == 0 ) return 1;
   printf ("Imposible conectar al servidor\n"); 

   return 0;
}



//--------------------------------------------------------------------------------------------------------------------------------------------

int EGL_InitWifi(int debug){

//--------------------------------------------------------------------------------------------------------------------------------------------
   if(!Wifi_InitDefault(WFC_CONNECT)) {
      return 0;
   } else {
      if (debug == true){
         struct in_addr ip, gateway, mask, dns1, dns2;
         ip = Wifi_GetIPInfo(&gateway, &mask, &dns1, &dns2);
         iprintf("ip     : %s\n", inet_ntoa(ip) );
         iprintf("gateway: %s\n", inet_ntoa(gateway) );
         iprintf("mask   : %s\n", inet_ntoa(mask) );
         iprintf("dns1   : %s\n", inet_ntoa(dns1) );
         iprintf("dns2   : %s\n", inet_ntoa(dns2) );   
      }         
      return 1;   
   }
}   



Código fuente del cliente y el servidor de PC (linux con CodeBlocks): Descargar

Muchas gracias desde ya ^^
¿Por qué no pruebas a conectarte a cualquier web por el puerto 80 y enviarle una petición HTTP y recoger el mensaje que te devuelve para ver si es problema del cliente de la NDS o es problema de la implementación de tu servidor?

Un saludo
Buenas, no he trabajado mucho con sockets, pero creo que el problema está en que en el código de DS intentas conectarte a la ip local de la consola y por ese motivo no obtienes respuesta del servidor en el PC. Creo que para que te funcione lo que tendrias que hacer es cambiar la ip "127.0.0.1" por la ip de red de tu pc (normalmente 192.168.0.x o 192.168.1.x, donde x puede ser cualquier numero de 1 a 255).

Un Saludo ;)
Davpk escribió:Buenas, no he trabajado mucho con sockets, pero creo que el problema está en que en el código de DS intentas conectarte a la ip local de la consola y por ese motivo no obtienes respuesta del servidor en el PC. Creo que para que te funcione lo que tendrias que hacer es cambiar la ip "127.0.0.1" por la ip de red de tu pc (normalmente 192.168.0.x o 192.168.1.x, donde x puede ser cualquier numero de 1 a 255).

Un Saludo ;)



Eso otra, ahora que veo el código, te estás conectando a la propia DS, por eso no te responde, como bien ha dicho Davpk ^^
Lo de poner 127.0.0.1 era porque estaba puesta mi IP real y no quería ponerla xD

De todas formas, probé también con la IP de la red local (192.168.X.X) y nada, así que ahí se ha quedado la cosa. Estoy probando los sockets en php, y aunque tampoco consigo mucho, consigo más que con los de C xD

Gracias por las respuestas ^^
keda escribió:Lo de poner 127.0.0.1 era porque estaba puesta mi IP real y no quería ponerla xD

De todas formas, probé también con la IP de la red local (192.168.X.X) y nada, así que ahí se ha quedado la cosa. Estoy probando los sockets en php, y aunque tampoco consigo mucho, consigo más que con los de C xD

Gracias por las respuestas ^^



Si tanto la DS como el PC están conectados al mismo router (como me imagino que será el caso xD) debes poner la ip privada, ya que si pones la pública, deberás habilitar ese puerto en la NAT del router, vamos, mucho mas lio para la misma faena xD
Los puertos estaban abiertos y mapeados (creo q se dice así) en el router, así que por puertos no creo que fuese :S
keda escribió:Los puertos estaban abiertos y mapeados (creo q se dice así) en el router, así que por puertos no creo que fuese :S


De todas formas, para comprobar si el problema es de tu servidor/PC o de la implementación de tu cliente, prueba a conectarte a, por ejemplo, marca.com al puerto 80 y enviale el mensaje: "GET / HTTP/1.0 \r\n\r\n" y capturar lo que te devuelve (que es el código html de la página). Si te devuelve el html es que está todo bien y el problema es de tu servidor.
Si, el problema era del servidor porque ahora que estoy con php he estado haciendo pruebas con GET y POST y no me han dado problemas ^^
8 respuestas