Foro de elhacker.net

Programación => .NET (C#, VB.NET, ASP) => Mensaje iniciado por: kub0x en 11 Abril 2012, 03:29 am



Título: [Sockets] Obtener Nombre del archivo
Publicado por: kub0x en 11 Abril 2012, 03:29 am
Buenas a aquellos que leais el post,

he decidido postear este tema en este foro ya que por el momento no trataré con ningun lenguaje de programación. Lo que pido al poder ser es CONSEJO ya que llevo un buen rato buscando.

El problema es el siguiente:

tengo una aplicación Cliente/Servidor en la cual se producen envios de aplicaciones y son recibidas por el cliente directamente. Claro que al guardar la aplicación en el lado del Cliente tengo que introducir el nombre del ejecutable resultante manualmente en el código.

Ya probé enviando desde el Servidor un paquete con el nombre del archivo y los datos de la aplicación a enviar, después en el Cliente obtuve el nombre del archivo, pero el archivo estaba corrupto :/

Mi pregunta es, ¿Cómo obtener en el lado del Cliente el nombre del archivo recibido?

Agradezco cualquier ayuda..

Saludos.


Título: Re: [Sockets] Obtener Nombre del archivo
Publicado por: kub0x en 11 Abril 2012, 12:49 pm
Animaros! seguramente más de alguno de vosotros haya codeado una aplicación Client/Server con lo que pido, solo os pido un consejillo nada más :P

Saludos.


Título: Re: [Sockets] Obtener Nombre del archivo
Publicado por: kub0x en 13 Abril 2012, 05:22 am
No me gustaría tener que empezar a matar gatitos... >:D

Vamos :P ¿ni una simple recomendación? será que no me he buscado la vida lo suficiente por la red... ¬¬

No os pido el code, si no una breve explicación con la que poder implementar lo que digais.

Saludos.


Título: Re: [Sockets] Obtener Nombre del archivo
Publicado por: kub0x en 14 Abril 2012, 20:06 pm
Movedlo a .NET

Sabía que iba a solucionarlo (con o sin ayuda....), en media horilla conseguí implementar lo que quería... El envío de archivos es asincronico, y se guardan con su respectivo nombre y formato. Los datos no llegan corruptos :)

Dejo las funciones de envío y de recibo (sólo en las que envío/proceso los datos) :

En el Servidor:

Código
  1. Private Sub Enviar_Datos(ByVal Ruta_Archivo As String, ByVal Cliente As TcpClient, _
  2.                             ByVal Nombre_Archivo As String)
  3.        If Cliente.Connected = True Then
  4.            Try
  5.                Dim Flujo_Red As NetworkStream = Cliente.GetStream()
  6.                Dim fileNameByte() As Byte = Encoding.ASCII.GetBytes(Nombre_Archivo)
  7.                Dim fileData() As Byte = My.Computer.FileSystem.ReadAllBytes(Ruta_Archivo)
  8.                Dim clientData() As Byte = New Byte(4 + fileNameByte.Length + fileData.Length) {}
  9.                Dim fileNameLen() As Byte = BitConverter.GetBytes(fileNameByte.Length)
  10.                fileNameLen.CopyTo(clientData, 0)
  11.                fileNameByte.CopyTo(clientData, 4)
  12.                fileData.CopyTo(clientData, 4 + fileNameByte.Length)
  13.                ListBox1.Items.Add(fileData.Length / 1024)
  14.                Flujo_Red.BeginWrite(clientData, 0, clientData.Length, _
  15.                                     New AsyncCallback(AddressOf Enviar_Datos_CallBack), Flujo_Red)
  16.            Catch ex As Exception
  17.                MsgBox(ex.Message)
  18.            End Try
  19.        Else
  20.            Escuchar()
  21.        End If
  22.  

En el Cliente:

Código
  1.    Private Sub RecibirDatos_CallBack(ByVal ar As IAsyncResult)
  2.        Try
  3.            Dim Buffer() As Byte = CType(ar.AsyncState, Byte())
  4.            Dim ns As NetworkStream = ClienteG.GetStream
  5.            ListBox1.Items.Add(Buffer.Length / 1024)
  6.            Dim Bytes_Leidos As Int32 = ns.EndRead(ar)
  7.            Dim fileNameLen As Byte = BitConverter.ToInt32(Buffer, 0)
  8.            Dim fileName As String = Encoding.ASCII.GetString(Buffer, 4, fileNameLen)
  9.            If Bytes_Leidos > 0 Then
  10.                Dim file As New FileStream(CurDir() & "\" & fileName, FileMode.Create, FileAccess.Write)
  11.                file.Write(Buffer, 4 + fileNameLen, Bytes_Leidos - 4 - fileNameLen)
  12.                file.Close()
  13.            Else
  14.                ReceiveDone.Set()
  15.            End If
  16.        Catch ex As Exception
  17.        End Try
  18.    End Sub
  19.  

Saludos.