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):
Public NotInheritable Class ClientInfo
Public ReadOnly Property UserName As String
Public ReadOnly Property Password As String
Public ReadOnly Property IpAddress As String
Private Sub New()
End Sub
Public Sub New(ByVal userName As String,
ByVal password As String,
ByVal ipAddress As String)
Me.UserName = userName
Me.Password = password
Me.IpAddress = ipAddress
End Sub
Public Function ToStream() As Stream
Dim ms As New MemoryStream()
Using writer As New BinaryWriter(ms, Encoding.Default, leaveOpen:=True)
With writer
.Write(3) ' Cantidad de valores.
.Write(Me.UserName)
.Write(Me.Password)
.Write(Me.IpAddress)
End With
End Using
ms.Seek(0, SeekOrigin.Begin)
Return ms
End Function
Public Shared Function FromStream(ByVal sr As Stream) As ClientInfo
Using reader As New BinaryReader(sr, Encoding.Default, leaveOpen:=True)
Dim count As Integer = reader.ReadInt32()
Dim list As New List(Of String)(count)
For x As Integer = 0 To (count - 1)
list.Add(reader.ReadString())
Next x
sr.Seek(0, SeekOrigin.Begin)
Return New ClientInfo(username:=list(0), password:=list(1), ipAddress:=list(2))
End Using
End Function
Public Overloads Shared Widening Operator CType(ByVal sender As Stream) As ClientInfo
Return ClientInfo.FromStream(sender)
End Operator
Public Overloads Shared Widening Operator CType(ByVal sender As ClientInfo) As Stream
Return sender.ToStream()
End Operator
Public Overloads Function ToString() As String
Return String.Format("{0};{1};{2}", Me.UserName, Me.Password, Me.IpAddress)
End Function
End Class
Ejemplo:
Dim ci As New ClientInfo("Elektro", "Contraseña", "255.255.255.255")
Dim clientSocket As Socket = ...
Dim netStream As New NetworkStream(clientSocket, ownsSocket:=True)
Using sr As Stream = ci.ToStream()
sr.CopyTo(netStream)
End Using
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!