Como subir datos a server con C

Iniciado por Hacklinx, 12 Febrero 2014, 09:18 AM

0 Miembros y 1 Visitante están viendo este tema.

Hacklinx

Hola estoy creando un juego y quiero que suba las puntuaciones a un servidor, se que puedo hacerlo escribiendo un script en un archivo de texto y ejecutarlo con system, pero de esa forma ese archivo de texto tendría los datos de usuario y contraseña del servidor, y sería visible para el usuario del juego al menos hasta que finalizaría el script y entonces ya podría borrarlo.

Este me parece un método fácil pero sin duda uno de los peores, si sabéis como puedo subir datos por FTP a un servidor, serían datos de puntuaciones.

Que tendría que poner en el C, pienso en sockets, pero aún no los controlo y aún asi para que me funcione algo con sockets debería de conocer la estructura del servidor que no es el caso.

Luego ¿alguna idea para subir los datos FTP a un servidor con C sin necesidad de crear un archivo donde ponga datos del servidor entre ellos usuario y contraseña de acceso?

Saludos

adastra

 Si quieres subir algo a un servidor, en algún sitio tienes que tener las credenciales para conectarte.... Lo que pasa es que FTP es un protocolo de texto que no cifra la comunicación entre clientes y servidor, por ese motivo es considerado inseguro, cualquiera en el segmento de red puede poner un sniffer y obtener las credenciales de acceso.
Lo que te recomendaría, es utilizar protocolo SFTP (FTP over SSH). Luego, para hacer las conexiones y la transferencia de ficheros desde C, te recomiendo utilizar libssh:
http://www.libssh.org/



eferion

La forma común de afrontar este problema es tener un servicio web escuchando en una dirección y puerto determinados. El cometido del servicio es recibir las puntuaciones de tu juego y almacenarlas en una base de datos para que sean accesibles vía web y/o vía el propio juego.

Lo que tiene que hacer tu juego en este caso es conectarse a dicho servicio para enviar la puntuación. Dicho proceso debería disponer de ciertas medidas de seguridad para, por lo menos, ponérselo difícil al que se quiera adjudicar una puntuación de mil trillones de puntos.

Para la comunicación con el servicio Web sería recomendable utilizar algún protocolo de comunicación independiente de la arquitectura del equipo ( JSON, XDR, ASN.1, protocol buffers, ... ). Aplicando un protocolo de estas características te ahorrarás quebraderos de cabeza futuros.



Hacklinx

Hola a todos y gracias por la respuesta, como bien sabéis busco alguna manera sencilla para mandar datos a un servidor, que es gratuito y no se que puertos tiene escuchando, ni que información está esperando, es un servidor gratuito en el que yo no puedo cambiar nada.

Partiendo de ahí, se me ocurre conectarme con FTP, pero es muy inseguro, SFTP no se como usarlo, pero aún asi bajo un MITM sería descifrable, el principal problema está en que al conectarme el programa, crea un archivo ftp.txt donde escribe los datos del servidor, y luego ejecuta ese script con un comando ftp -s:ftp.txt

Si con SFTP hay que hacer lo mismo para conectarse no me interesa, pues siescribo los datos en un archivo, no hará falta ni abrir un simple sniffer, sería pésima calidad.

Descartando sockets, ya que no se puertos de escucha, ni como mandar los datos, ni la estructura del servidor, solo me queda usar FTP o SFTP.

No se como usar SFTP, si me podéis guiar un poco para subir los archivos estaría agradecido, de todas formas lo buscaré. Y si conocéis un buen código para subir los datos al servidor sea del lenguaje que sea sin conocer estructura del servidor, es decir conociendo solo server, user, pas que sea seguro estaría agradecido, alguna idea más práctica.

Saludos

eferion

Hablas de un servidor... imagino que será un servidor web.

Los servidores web escuchan peticiones por defecto por el puerto 80.

Obviamente esa configuración no vas a poder tocarla salvo que pagues... pero sí que puedes meter páginas en ese servidor web para que el servidor sea "útil".

Para poder montar un servicio web necesitas que tu servidor disponga de algún tipo de lenguaje de servidor ( php o asp.net son algunos ejemplos ).

Si tu servidor no soporta la ejecución de páginas dinámicas entonces yo te recomendaría buscarte otro servidor.

Como te he comentado, la opción del servidor ftp no la veo muy viable por varias razones:

* Al dar acceso vía ftp tienes que publicar en tu programa los datos de acceso vía FTP al servidor web... eso significa que en menos de una semana te han llenado el servidor FTP de ***** varia.

* Al forzar todas las conexiones por FTP no vas a poder usar el mismo archivo para almacenar las puntuaciones de varios jugadores.... puedes acabar machacando resultados en caso de concurrencia.

* Si optas por que cada usuario utilice un archivo diferente necesitarás algún mecanismo en tu código para poder recuperar todos los archivos y mostrar a cada usuario un ranking... además tendrías que garantizar que los nombres de archivos no se solapan para evitar machacar resultados.

* El punto de acceso FTP es un cuello de botella

* El tráfico FTP de un servidor gratuito suele estar más restringido que el acceso web, por lo que puedes acabar con facilidad con problemas para mantener el servicio en pie.

Yo solo veo un montón de inconvenientes y ninguna ventaja...

Hacklinx

#5
Eso es FTP es inseguro, y además falla pues cuando el script está en proceso  hay veces que se cuelga como me acaba de ocurrir, al usar el "put" si falla no es capaz de reconectar y reintentarlo por si solo según parece.

Tengo un servidor web gratuito, subo las cosas por protocolo FTP normalmetne con filezilla, pero entonces que solución puedo tomar para usar alguna conexión segura, o en el caso de que no pueda, que es lo que debería hacer, no creo que pueda tocar nada del servidor, entonces solo me queda FTP no? xp

Edito: lo que quiero es saber un modo seguro para poder subir los datos a mi servidor web gratuito con un programa en C, o con otro lenguaje, de alguna manera segura y fiable, al menos más de la que estoy usando actualmente con el script FTP.

saludos

eferion

A ver, esto es como los mensajes de whatsapp... no vale solo con leer el último párrafo, hay que leerlo todo.

Te he comentado que para disponer de una solución factible, tu servidor ha de soportar el uso de páginas dinámicas, ya sea con java, php, asp.net ... si tu servidor no tiene soporte para eso deberías buscarte otro servidor.

Cuando tengas un servidor que de soporte para páginas dinámicas, entonces tienes que programarte un servicio web que haga de pasarela entre tu aplicación y la base de datos que utilizarás para guardar los rankings.

La pasarela debería permitir, al menos, dos tipos de peticiones:

* Registrar una nueva marca
* Devolver el ranking de usuarios ( o al menos los X primeros ).

Si no sabes de qué estoy hablando deberías plantearte bajar el listón una temporada y afianzar conocimientos al respecto.

Hacklinx

Asi es mi servicio web gratuito es dinámico y uso PHP, para mostrar los archivos de puntuaciones que subo automáticamente, ahora bien eso que tu dices de buscar una forma de anclar el servicio de subida PHP con el programa en C no se como hacerlo, si que podría poner un botón en la página para subir el archivo, pero no sería lo que busco, quiero que lo haga automáticamente todo ese proceso.

Eso de la pasarela y todo eso me pierde bastante aunque estoy muy interesado en saber como hacerlo :)

Saludos

eferion

toda comunicación por red, ya sea las páginas web, el servidor FTP, ... va por sockets.

Lo que tienes que hacer es  lo siguiente (recuerdo, por si acaso, que es un ejemplo):

Pensarte con tranquilidad la funcionalidad del servidor. Por ejemplo:
* Registrar nueva marca: se necesita nick y marca
* enviar ranking: se necesita posición de inicio y envía los 10 siguientes.

Ahora, en el servidor:
* Creas una página, por ejemplo "registro.php" que reciba por get el nick y la marca... coges esos argumentos y se los enchufas a la base de datos
* Creas otra pagina web "ranking.php" que reciba por get la posición de inicio y genera un XML, por ejemplo, con las diez posiciones de ranking recibidas.

En el cliente:
* Preparas el código para que sea capaz de lanzar peticiones http. Estas peticiones se hacen usando sockets (si no usas ninguna librería específica) por TCP y tienen que ir dirigidas al puerto 80 del servidor.
* Implementas una función que sea capaz de enviarle al servidor la marca conseguida por el usuario ( a registro.php ) y pasándole los argumentos por GET.
* Implementas una función que sea capaz de enviarle al servidor la posición a mostrar del ranking ( a ranking.php ) y pasándole la posición de inicio por GET.

Y ya está!!! vale, esto lleva algo más de tiempo que el que he empleado para describir el ejemplo... pero estos son los pasos básicos.

Puedes diseñar soluciones más elegantes... pero eso ya depende de tus ganas, tus recursos y tus conocimientos.

Vaagish

Ahí te va! Hace 2 semanas que estoy luchando con el código para subir una imagen via HTTP,, pero para lo que vos precisas tengo la solución!

La idea es esta (como dice eferion):

CitarEn el cliente:
* Preparas el código para que sea capaz de lanzar peticiones http. Estas peticiones se hacen usando sockets (si no usas ninguna librería específica) por TCP y tienen que ir dirigidas al puerto 80 del servidor.

Vas a lanzar peticiones HTTP (como si fueras un navegador web) pero va a ser tu cliente (juego), pero no por GET, sino por POST. Acá tenes el ejemplo:

Citarchar HTTPStr[] = "POST /TuCarpeta/Score.php?";
char HTTPEnd[] = "HTTP/1.1\r\nhost: TuHost\r\n\r\n";

El score se envía en variables después del ?,, algo así: Score.php?Name=Pepe&Score=50&... (etc)

Citaren C no se como hacerlo,

Si no has trabajado con Sockets,, tenes un camino por recorrer aun igual antes de llegar a esto que te digo..

Saludos!! Suerte!