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


 


Tema destacado: Arreglado, de nuevo, el registro del warzone (wargame) de EHN


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP) (Moderador: kub0x)
| | | |-+  Como puedo elaborar esta idea ?
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: Como puedo elaborar esta idea ?  (Leído 2,381 veces)
TrashAmbishion


Desconectado Desconectado

Mensajes: 693


Ver Perfil
Como puedo elaborar esta idea ?
« en: 23 Julio 2016, 00:22 »

Hola,

Amigos tengo una aplicación cliente/servidor, cuando un cliente se conecta tengo un ListBox al que añado la ip del cliente, pero esto necesito modificarlo y mostrar el nombre del cliente, esto lo puedo hacer sin problemas el tema es que tengo una opción para desconectar a un cliente y necesito pasarle como parámetro la ip de dicho cliente que sacaba del ListBox pero si en vez de añadir la ip añado el nombre al Listbox ya tendría que ingeniar otra forma.

Como podría solucionar esto.

Salu2 y gracias de antemano !!


En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #1 en: 23 Julio 2016, 00:42 »

Como podría solucionar esto.

Simplemente crea un type para almacenar el nombre y la ip, y en el listbox muestras uno de esos dos datos almacenados:

Código
  1. Public Class ClientInfo
  2.  
  3.    Public ReadOnly Property Ip As String
  4.    Public ReadOnly Property Name As String
  5.  
  6.    Private Sub New()
  7.    End Sub
  8.  
  9.    Public Sub New(ip As String, name As String)
  10.         Me.Ip = ip
  11.         Me.name  = name
  12.    End Sub
  13.  
  14. End Class

Código
  1. Dim clients As New List(Of ClientInfo)
  2. clients.Add(New ClientInfo("255.255.255.255", "Elektro"))
  3. clients.Add(...)
  4.  
  5. For Each client As ClientInfo In clients
  6.    ListBox1.Add(client.Name)
  7. Next

Obtener ip por nombre:
Código
  1. Dim ip As String = (From client As ClientInfo In clients Where client.Name.Equals("Elektro")).Single()

Otra forma de elaborar la idea, sobre todo la obtención de la ip, sería crear/heredar una colección y añadir un indexer que tome un nombre, es más cool pero es un ejemplo algo costoso de escribir y con eso que te puse arriba con LINQ consigues lo mismo.

Saludos


« Última modificación: 23 Julio 2016, 00:52 por Eleкtro » En línea


TrashAmbishion


Desconectado Desconectado

Mensajes: 693


Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #2 en: 23 Julio 2016, 04:55 »

Gracias voy a implementarlo.

PD: Cuando desconecte a un cliente evidentemente tengo que retirarlo del List, supongo que llamando al metodo:


Código
  1. clients.remove

Salu2
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 693


Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #3 en: 23 Julio 2016, 05:45 »

Me dice en la línea

Código
  1.    Dim ip As String = (From client As ClientInfo In clients Where client.Name.Equals("Elektro")).Single()

Que no puede convertir el valor de ClientInfo a String

Salu2
En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 693


Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #4 en: 5 Agosto 2016, 06:59 »

Necesito pasar una estructura:

Usuario
Contraseña
Ip

Pudiera usar la misma idea, verdad?

La duda que tengo y me tiene pensativo es como paso esa estructura de una forma no muy rebuscada (para futuro entendimiento) hacia la otra aplicación y esta la pueda utilizar sin mucha complicación.

Salu2 y gracias de antemano
En línea

Eleкtro
Ex-Staff
*
Desconectado Desconectado

Mensajes: 9.709



Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #5 en: 5 Agosto 2016, 11:29 »

Necesito pasar una estructura:

Usuario
Contraseña
Ip

Pudiera usar la misma idea, verdad?

Por supuesto, la idea que te mostré arriba la puedes implementar con la cantidad de campos que desees. Por otro lado, si por "estructura" también te estás refiriendo a utilizar el tipo Structure, entonces debes tener en cuenta la cantidad de campos que definas, o mejor dicho el tamaño de la estructura, y si los campos se pasan por valor o por referencia.



La duda que tengo y me tiene pensativo es como paso esa estructura de una forma no muy rebuscada (para futuro entendimiento) hacia la otra aplicación y esta la pueda utilizar sin mucha complicación.

Tienes varias opciones para la comunicación entre procesos, pero ya que tu aplicación se basa en el uso de Sockets, entonces lo más directo sería aprovecharte de una metodología basada en Sockets, por ejemplo creando un NetworkStream basado en un Socket.

Teniendo una class como esta de aquí abajo definida tanto en la app cliente como en la app servidor, tienes a tu disposición varias alternativas para llevar a cabo lo mismo (la conversión de tipos):
Código
  1. Public NotInheritable Class ClientInfo
  2.  
  3.    Public ReadOnly Property UserName As String
  4.    Public ReadOnly Property Password As String
  5.    Public ReadOnly Property IpAddress As String
  6.  
  7.    Private Sub New()
  8.    End Sub
  9.  
  10.    Public Sub New(ByVal userName As String,
  11.                   ByVal password As String,
  12.                   ByVal ipAddress As String)
  13.  
  14.        Me.UserName = userName
  15.        Me.Password = password
  16.        Me.IpAddress = ipAddress
  17.  
  18.    End Sub
  19.  
  20.    Public Function ToStream() As Stream
  21.        Dim ms As New MemoryStream()
  22.  
  23.        Using writer As New BinaryWriter(ms, Encoding.Default, leaveOpen:=True)
  24.            With writer
  25.                .Write(3) ' Cantidad de valores.
  26.                .Write(Me.UserName)
  27.                .Write(Me.Password)
  28.                .Write(Me.IpAddress)
  29.            End With
  30.        End Using
  31.  
  32.        ms.Seek(0, SeekOrigin.Begin)
  33.        Return ms
  34.    End Function
  35.  
  36.    Public Shared Function FromStream(ByVal sr As Stream) As ClientInfo
  37.  
  38.        Using reader As New BinaryReader(sr, Encoding.Default, leaveOpen:=True)
  39.            Dim count As Integer = reader.ReadInt32()
  40.            Dim list As New List(Of String)(count)
  41.  
  42.            For x As Integer = 0 To (count - 1)
  43.                list.Add(reader.ReadString())
  44.            Next x
  45.            sr.Seek(0, SeekOrigin.Begin)
  46.  
  47.            Return New ClientInfo(username:=list(0), password:=list(1), ipAddress:=list(2))
  48.        End Using
  49.  
  50.    End Function
  51.  
  52.    Public Overloads Shared Widening Operator CType(ByVal sender As Stream) As ClientInfo
  53.        Return ClientInfo.FromStream(sender)
  54.    End Operator
  55.  
  56.    Public Overloads Shared Widening Operator CType(ByVal sender As ClientInfo) As Stream
  57.        Return sender.ToStream()
  58.    End Operator
  59.  
  60.    Public Overloads Function ToString() As String
  61.        Return String.Format("{0};{1};{2}", Me.UserName, Me.Password, Me.IpAddress)
  62.    End Function
  63.  
  64. End Class

Ejemplo:
Código
  1. Dim ci As New ClientInfo("Elektro", "Contraseña", "255.255.255.255")
  2. Dim clientSocket As Socket = ...
  3. Dim netStream As New NetworkStream(clientSocket, ownsSocket:=True)
  4.  
  5. Using sr As Stream = ci.ToStream()
  6.    sr.CopyTo(netStream)
  7. End Using

Código
  1. Dim ci As ClientInfo = ClientInfo.FromStream(netStream)

Hay varias maneras de hacerlo, también podrías especificar el tamaño de cada string en los primeros bytes para parsearlo de otra manera, como a ti te resulte mejor. O incluso puedes recurrir a técnicas de marshalling con estructuras de un tamaño fijo definido, pero eso lo veo innecesario, rebuscado y sobretodo tedioso.

Lo cierto es que no lo he testeado en profundidad usando un socket, pero espero que esa class y el ejemplo te sirva para hacerte una idea, si sigues teniendo dudas o no te convence esa metodología entonces puedes probar otras:

Saludos!
« Última modificación: 5 Agosto 2016, 11:38 por Eleкtro » En línea


TrashAmbishion


Desconectado Desconectado

Mensajes: 693


Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #6 en: 6 Agosto 2016, 16:08 »

Muchas gracias lo analizaré y acomodaré.

Thx a lot..

En línea

TrashAmbishion


Desconectado Desconectado

Mensajes: 693


Ver Perfil
Re: Como puedo elaborar esta idea ?
« Respuesta #7 en: 12 Agosto 2016, 17:22 »

El código esta perfecto lo que sucede es que no lo he podido implementar del todo por que hay cosas que no comprendo bien y no logro adaptarlo al proyecto que estoy usando como base.

El codigo que tengo envia asi:

Código
  1. _socket.Send(textSend.Text)

Mi pregunta hay alguna forma de mandar el tipo ClientInfo usando esta opción y poderlo recibir en el Servidor para hacer una comparación con los usuarios registrados.
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines