Anuncios Google

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 ^^

 


Proyectos en curso

El Taller de Eglomer


Anuncios Google

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.
Imagen de eglomer

No, ya probé a cambiar la

No, ya probé a cambiar la IP por la externa como por la interna dentro de la red local y nada :S

Imagen de kNightFox

Mi libreria haceya dias que

Mi libreria haceya dias que soporta wifi (por su implementacion al Navy Wars)

Te dejo lo que llevo hecho que si que funciona, ds contra ds via AP o contra un servidor telnet (o lo que sea)

Archivo nf_wifi.h: http://nightfox.pastebin.com/m1a01462f
Archivo nf_wifi.c: http://nightfox.pastebin.com/m6eb5f11a
Archivo main.cpp: http://nightfox.pastebin.com/m7f6b0f07

 

Os recuerdo que tanto mi libreria como todo el codigo deribado (incluido este) esta bajo licencia creative commons.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de eglomer

Hola Knight Fox! Muchas

Hola Knight Fox!

Muchas gracias por ofrecerme tus librerías y por contestar (hasta ahora eres el único en 5 comunidades de programación DS xD). La verdad es que estuve pensando en usarlas, pero al ver que no tenían soporte para wifi la verdad es que me eché un poco atrás. Es una buena noticia el ver que eso ha sido solventado ^^  Lo malo es que, por lo que veo, tus funciones son para crear clientes/servidores en UDP, y yo lo que intento es crearlo con TCP, así que de momento seguiré buscando a ver si consigo que funcione de una puñetera vez. Una vez más, gracias ^^ 

Un saludo y ánimo, tanto con las librerías como con el navy wars.


Proyectos en curso

El Taller de Eglomer

Imagen de kNightFox

No, si cambiando dos lineas

No, si cambiando dos lineas te funciona con tcp/ip.

Yo he sacado informacion de aqui

http://www.prasannatech.net/2008/07/socket-programming-tutorial.html
http://www.beej.us/guide/bgnet/

Empece con tpc/ip, pero me jodian demasiado los timeout y que muchas veces se queda pillado el socket esperando datos, cosa que solucione con UDP. Es mas rapido, pero tienes que verificar que los datos recibidos son correctos.


Nuestra web oficial:
http://www.nightfoxandco.com/
 
Siguenos en facebook:
http://www.facebook.com/pages/NightFox-Co/284338634917917
 
Por favor, no useis los MP para preguntas, usar el FORO:
http://www.nightfoxandco.com/forum/
Asi nos ahorramos de contestar lo mismo 20 veces.

 

Imagen de eglomer

lo de que se te quede

lo de que se te quede pillado el socket creo que puedes solucionarlo con lo de NON_BLOCKING de mi código, o eso entendí no me acuerdo en qué página.

Seguiré investigando a ver. Gracias por los links ^^


Proyectos en curso

El Taller de Eglomer

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.