elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Recopilación Tutoriales y Manuales Hacking, Seguridad, Privacidad, Hardware, etc


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  [DUDA C#] Pasar array por sockets
0 Usuarios y 2 Visitantes están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: [DUDA C#] Pasar array por sockets  (Leído 11,139 veces)
Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
[DUDA C#] Pasar array por sockets
« en: 28 Febrero 2013, 18:05 pm »

Estoy haciendo la v0.4 de mi juego de hundir la flota, la novedad es el modo online, por ahora va bien, he conseguido pasar cosas básicas como valores de variables pero me he quedado pillado en pasar el array de la posiciones de los barcos en el tablero lo cual no me deja por sockets.

Me preguntaba si habría otra forma por sockets de pasar un array.

Tengo en mente otra solución más cutre...pasar todas las posiciones del array una a una pero el array tiene 6 filas y 8 columnas...no es plan pasar 48 variables de un tablero y 48 de otro.


En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
TomaSs

Desconectado Desconectado

Mensajes: 101



Ver Perfil
Re: [DUDA C#] Pasar array por sockets
« Respuesta #1 en: 28 Febrero 2013, 20:19 pm »

Pues nunca lo he hecho, pero supongo que tendrás que hacerlo así, pasarlas de una en una o todas juntas con alguna marca de separación o algo así, supongo...
Al final que más dará sueltas que todas juntas, ya que si todas ocupan, por ejemplo, 20 bytes, tendrás que pasar 20 bytes si o si, separadas o juntas.
No se, supongo...


En línea

Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
Re: [DUDA C#] Pasar array por sockets
« Respuesta #2 en: 28 Febrero 2013, 21:02 pm »

Hombre, por el tema de tamaño no es que me preocupe mucho, sino el tema de organizacion y limpieza, son 48 líneas más por clase si lo hago de forma chapuza, en total 96 más unas 4 por envío ya que al enviar y recibir hace falta cifrar y descifrar a ASCII por carácter, vamos que 4 x 48 x 2(clases) = 384 líneas más de código, no merece la pena.

A ver si existe una solución más simple que evite tanto código.
En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [DUDA C#] Pasar array por sockets
« Respuesta #3 en: 28 Febrero 2013, 22:46 pm »

Lo que haces es serializar el array de un lado, y deserializar del otro :P
BinaryFormatter y array de bytes :P
http://msdn.microsoft.com/es-uy/library/system.runtime.serialization.formatters.binary.binaryformatter(v=vs.80).aspx

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
Re: [DUDA C#] Pasar array por sockets
« Respuesta #4 en: 28 Febrero 2013, 23:51 pm »

Gracias, desconocía este tema de serialización, no sabía ni que existiese. Investigo y aver que consigo  :D
En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
TomaSs

Desconectado Desconectado

Mensajes: 101



Ver Perfil
Re: [DUDA C#] Pasar array por sockets
« Respuesta #5 en: 1 Marzo 2013, 03:47 am »

Pues cuando consigas algo interesante te agradecería que lo postearas, ya que me parece útil, y podrá venirme bién en un futuro.

Suerte ;)
En línea

kub0x
Enlightenment Seeker
Moderador
***
Desconectado Desconectado

Mensajes: 1.486


S3C M4NI4C


Ver Perfil
Re: [DUDA C#] Pasar array por sockets
« Respuesta #6 en: 1 Marzo 2013, 11:28 am »

Como te dijo NovLucker, la serialización es la respuesta. Aun me acuerdo cuando era novato y escribia al otro extremo un Array que contenía información de tipo int32, entonces en el otro lado lo que hacia era ir extrayendo la info del Array cada 4 posiciones, ya que un int32 en un Array de Bytes es representado en 4 bloques de Bytes xD. Bastante tedioso la verdad pero a la vez divertido.

Ya nos contarás que tal ha quedado la implementación, suerte.

Saludos!
En línea

Viejos siempre viejos,
Ellos tienen el poder,
Y la juventud,
¡En el ataúd! Criaturas Al poder.

Visita mi perfil en ResearchGate

Dryken

Desconectado Desconectado

Mensajes: 117


El arte de vencer se aprende en las derrotas


Ver Perfil WWW
Re: [DUDA C#] Pasar array por sockets
« Respuesta #7 en: 1 Marzo 2013, 21:14 pm »

TomaSs no te preocupes que si doy con la forma de conseguirlo lo compartiré por aquí pero por ahora no tengas mucha confianza en mi, llevo todo el día metiendole mano a este tema y no tengo forma de sacarlo.

kub0x que suerte que ya hayas pasado por este tipo de problemas, jaja lo que daría por estar en tu lugar,  y esa solución que comentas, cuando no te queda otra hay que ir a por lo básico  ;D

Aver os cuento,...Esto de la serialización es peor de lo que pensaba aunque eso ya lo imaginaba de antes.

Hasta ahora lo que he echo ha sido serializar un objeto y pasarlo a través de un networkstream. El caso es que creo que lo he conseguido pero en el momento que el cliente lo envia(serializa) y el server lo recibe(deserializa), el server se queda pillado, no reacciona pero el cliente si.

Me he basado de este ejemplo

Serializar

Código
  1. IPEndPoint ipe = new IPEndPoint(IPAddress.Parse("127.0.0.1"), 5000);
  2. NetworkStream net = new NetworkStream(new Socket(ipe.AddressFamily, SocketType.Stream, ProtocolType.Tcp));
  3. BinaryFormatter bf = new BinaryFormatter();
  4. Bitmap bmp = new Bitmap(@"C:\imagen.gif");
  5. bf.Serialize(net, bmp);
  6. net.Close();

En el destino Deserializas el objeto:

Código
  1. BinaryFormatter bf = new BinaryFormatter();
  2. Bitmap bmp;
  3. bmp = (Bitmap)bf.Deserialize(net);
  4. net.Close();

-----------------------------------------------------------------------------------------------------------------------
En este pequeño ejemplo se demuestra lo que quiero conseguir pero en el proyecto no me funciona :/

Código
  1.  
  2.        Socket sC = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  3.        IPEndPoint ipC = new IPEndPoint (IPAddress.Parse ("127.0.0.1"), 6000);  
  4.  
  5.                int[] tableroJ1 = new int[5];
  6.        tableroJ1[0] = 2;
  7.        tableroJ1[1] = 5;
  8.  
  9.        NetworkStream net = new NetworkStream(sC);
  10.        BinaryFormatter bf = new BinaryFormatter();
  11.  
  12.        try{
  13.            bf.Serialize(net, tableroJ1);
  14.        }catch (SerializationException e){
  15.            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
  16.            throw;
  17.        }finally{
  18.            net.Close();
  19.        }

Código
  1.  
  2.        Socket sC = new Socket (AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);
  3.        IPEndPoint ipC = new IPEndPoint (IPAddress.Parse ("127.0.0.1"), 6000);  
  4.  
  5.                int[] tableroJ1 = new int[5];
  6.        tableroJ1[0] = 2;
  7.        tableroJ1[1] = 5;
  8.  
  9.        NetworkStream net = new NetworkStream(sC);
  10.        BinaryFormatter bf = new BinaryFormatter();
  11.  
  12.        try{
  13.            bf.Serialize(net, tableroJ1);
  14.        }catch (SerializationException e){
  15.            Console.WriteLine("Failed to serialize. Reason: " + e.Message);
  16.            throw;
  17.        }finally{
  18.            net.Close();
  19.        }
  20.        Console.WriteLine("Pos 0 --> "+tableroJ1[0]);  // Mostrara un 2
  21.        Console.WriteLine("Pos 1 --> "+tableroJ1[1]); // Mostrara un 5

También he leido por ahí que existe una clase remoting que podría hacer algo similar, no se si ayudaría a conseguir pasar un array por sockets...mira que es difícil  :-\

En línea

Lo intentas y fracasas, lo intentas y fracasas pero fracasas realmente cuando dejas de intentarlo.

Calc Don v0.7 - C
http://foro.elhacker.net/programacion_cc/source_calculadora_calc_don_10-t366489.0.html

Hundir la flota v0.3 - C#
http://foro.elhacker.net/net/source_c_juego_hundir_la_flota_v01-t377794.0.html
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [DUDA C#] Pasar array por sockets
« Respuesta #8 en: 1 Marzo 2013, 21:16 pm »

Es muy fácil, más tarde te pego código ;) (bastante más tarde :xD)

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Novlucker
Ninja y
Colaborador
***
Desconectado Desconectado

Mensajes: 10.683

Yo que tu lo pienso dos veces


Ver Perfil
Re: [DUDA C#] Pasar array por sockets
« Respuesta #9 en: 2 Marzo 2013, 02:47 am »

Bueno, tal vez no te resulte tan fácil la implementación :xD

Servidor
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;
  5. using System.Threading.Tasks;
  6. using System.Net;
  7. using System.Net.Sockets;
  8. using System.Runtime.Serialization.Formatters.Binary;
  9. using System.IO;
  10.  
  11. namespace TcpServer
  12. {
  13.    class Program
  14.    {
  15.        static void Main(string[] args)
  16.        {
  17.            //nos ponemos a la escucha
  18.            TcpListener tcpListener = new TcpListener(IPAddress.Parse("127.0.0.1"), 31337);
  19.            tcpListener.Start();
  20.  
  21.            //buffer temporal para recibir data
  22.            byte[] buffer = new byte[256];
  23.            //el encargado de deserializar la data recibida
  24.            BinaryFormatter formatter = new BinaryFormatter();
  25.            //una lista auxiliar para ir almacenando los bytes
  26.            List<byte> byteList = new List<byte>();
  27.  
  28.            while (true)
  29.            {
  30.                Console.WriteLine("Esperando data :)");
  31.  
  32.                //acepto la conexión
  33.                TcpClient tcpClient = tcpListener.AcceptTcpClient();
  34.                NetworkStream networkStream = tcpClient.GetStream();
  35.  
  36.                //leo y almaceno en buffer
  37.                while (networkStream.Read(buffer, 0, buffer.Length) > 0)
  38.                {
  39.                    //dado que uso el mismo buffer siempre, voy almacenando los bytes en una lista
  40.                    byteList.AddRange(buffer.ToList());
  41.                }
  42.  
  43.                networkStream.Close();
  44.                tcpClient.Close();
  45.  
  46.                //stream auxiliar para luego deserializar
  47.                using (MemoryStream memoryStream = new MemoryStream(byteList.ToArray()))
  48.                {
  49.                    //se deserializa y castea a tipo correcto
  50.                    int[] data = (int[])formatter.Deserialize(memoryStream);
  51.  
  52.                    //simplemente para mostrar la data
  53.                    foreach (int i in data)
  54.                    {
  55.                        Console.WriteLine("Se recibió el número {0}", i);
  56.                    }
  57.                }
  58.            }
  59.        }
  60.    }
  61. }

Cliente
Código
  1. using System;
  2. using System.Collections.Generic;
  3. using System.IO;
  4. using System.Linq;
  5. using System.Net.Sockets;
  6. using System.Runtime.Serialization.Formatters.Binary;
  7. using System.Text;
  8. using System.Threading.Tasks;
  9.  
  10. namespace tcpClient
  11. {
  12.    class Program
  13.    {
  14.        static void Main(string[] args)
  15.        {
  16.            //la data que voy a enviar
  17.            int[] data = new int[] { 18, 10, 13, 89 };
  18.  
  19.            TcpClient tcpClient = new TcpClient("localhost", 31337);
  20.  
  21.            using (NetworkStream networkStream = tcpClient.GetStream())
  22.            {
  23.                using (MemoryStream memoryStream = new MemoryStream())
  24.                {
  25.                    BinaryFormatter formatter = new BinaryFormatter();
  26.                    //serializo la data en el stream auxiliar
  27.                    formatter.Serialize(memoryStream, data);
  28.                    byte[] buffer = memoryStream.GetBuffer();
  29.  
  30.                    //envio la data
  31.                    networkStream.Write(buffer, 0, buffer.Length);
  32.                }
  33.            }
  34.  
  35.            tcpClient.Close();
  36.        }
  37.    }
  38. }

Lo he comentado, así que espero se entienda ;)

Saludos
En línea

Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD
"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
array de sockets
Programación Visual Basic
grester43hck 5 4,061 Último mensaje 13 Agosto 2010, 12:58 pm
por grester43hck
Pasar parametros a un array
Scripting
El_Java 1 3,705 Último mensaje 17 Mayo 2011, 23:09 pm
por leogtz
Pasar un array por una función
PHP
dimitrix 8 4,478 Último mensaje 19 Junio 2011, 22:47 pm
por cassiani
pasar contenido de txt a array
.NET (C#, VB.NET, ASP)
birdez 3 5,881 Último mensaje 17 Mayo 2012, 21:17 pm
por birdez
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines