uso - tcp ip visual c#
¿Se puede usar TCPClient sin una tarjeta de red? (1)
Estoy usando TCPClient
y TCPListener
para enviar datos entre aplicaciones que se ejecutan en la misma computadora. Apunto a Framework 4.5 para que las aplicaciones se ejecuten en Windows Vista SP2 y en adelante si no me equivoco. Estoy usando un código muy simple para esto:
Cliente:
Try
Using c = New Net.Sockets.TcpClient()
c.Connect("localhost", 7643)
If c.Connected Then
Dim Specs As New List(Of Spectrum)
'' Generating some data here to send
Using stream = c.GetStream
Dim xml As New Xml.Serialization.XmlSerializer(GetType(List(Of Spectrum)))
xml.Serialize(stream, specs)
End Using
End If
End Using
Catch sEx As Net.Sockets.SocketException
MessageBox.Show("Could not send the data." & vbCrLf & _
"This can have multiple reasons:" & vbCrLf & _
"(i) The receiver is not running" & vbCrLf & _
"(ii) A firewall is blocking the connection")
Catch ex As Exception
MessageBox.Show("An unexpected exception occured while sending the data: " & vbCrLf & _
ex.Message)
End Try
Servidor:
Private Async Sub DoListen()
Do
Dim client = Await datagrabber.AcceptTcpClientAsync
If client IsNot Nothing AndAlso client.Connected Then
Dim t = Task.Run(Sub() HandleClient(client, Date.Now))
End If
Loop
End Sub
Private Sub HandleClient(client As Net.Sockets.TcpClient)
Dim specs As New List(Of RelaxIS_Shared.CSSpectrum)
Using stream = client.GetStream
Dim ser As New System.Xml.Serialization.XmlSerializer(GetType(List(Of RelaxIS_Shared.CSSpectrum)))
specs = CType(ser.Deserialize(stream), List(Of RelaxIS_Shared.CSSpectrum))
client.Close()
End Using
'' Do stuff with data
End Sub
Esto funciona bien, pero empecé a preguntarme si esa es realmente una forma inteligente de enviar datos entre aplicaciones. Por ejemplo, ¿esto siempre funciona en una máquina moderna de Windows o qué pasa si la computadora en cuestión no tiene una tarjeta de red? ¿Las conexiones TCP están virtualizadas de algún modo para funcionar en la IP del host local, independientemente del hardware real del sistema?
Encontré mucha información sobre múltiples tarjetas de red pero realmente nada sobre ninguna tarjeta de red.
Ya traté de desactivar todas las tarjetas de red en Windows. En este caso, todavía funcionó, pero ¿es siempre el caso o puede haber una configuración de hardware / software que no permite el uso de conexiones TCPClient?
Me gusta el principio porque funciona muy bien y es menos complicado que decir compartir archivos, por ejemplo. No tengo experiencia en cosas como el Marco de comunicación de Windows y, por lo tanto, estoy apegado a los métodos que conocía primero.
Ambas respuestas en C # o VB.NET son muy apreciadas, si el código es necesario.
Una breve actualización : en base a la respuesta aceptada del usr a continuación, implementé la comunicación utilizando conductos con nombre. Básicamente es el mismo código, funciona perfectamente y definitivamente vale la pena buscar a alguien que se encuentre en la misma posición que yo. Tampoco puede tener problemas con los firewalls, que son especialmente frecuentes en las PC comerciales.
Y una actualización más : usr tenía aún más razón. Las tuberías con nombre son buenas y buenas, pero vale la pena leer en WCF. Puede parecer abrumador al principio, pero implementar una pequeña interfaz de transferencia de datos entre sus aplicaciones es muy breve y fácil. Y recorre muchos kilómetros para poder simplemente "llamar a un método en la otra aplicación" una vez que esté en funcionamiento. No hay conversiones de tipo, no hay datos de serialización en su extremo de ninguna manera ... es genial y vale la pena la curva de aprendizaje.
TCP siempre funciona para conexiones locales. Estas se llaman conexiones de retroalimentación. No necesita enchufar un cable Ethernet dos veces en su computadora para que se comunique solo ...
Para las comunicaciones locales, las tuberías con nombre son una buena alternativa. Son más simples y un poco más rápidos. .NET los admite bien.
Si es posible, abandone TCP y cualquier otra interfaz basada en flujo. Utilice un mecanismo de RPC de nivel superior, como .NET remoting (muy simple, funciona con canalizaciones con nombre) o WCF. WCF no necesita un proyecto de sitio web para alojarse en.
Básicamente, cualquier cosa es mejor que escribir un mecanismo RPC usted mismo.