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):
DescargarMuchas gracias desde ya ^^