Hola a todos,
Tengo un problema cuando llevo una aplicación de vb.net 2005 de un XP a un windows 7. Dicha aplicación esta trabajando con comunicaciones TCP-IP.
La cuestión es que cuando llevo la parte del cliente al windows 7, me funciona correctamente si la aplicación servidora esta en windows XP. Si al contrario tengo la aplicación servidora en Windows 7 y la aplicación en un Windows XP o en el propio 7, no me puedo conectar. Por lo que esta claro que el problema surge con la parte servidora.
En este punto, como es logico, la mayoria de la gente pensara en algun firewall o angun antivirus que me este bloqueando el paso, pero aun desactivando el "panda cloud" y el firewall de windows 7, me sigue fallando la comunicación.
El codigo del servidor es el siguiente:
Imports System
Imports System.Threading
Imports System.Net.Sockets
Imports System.IO
Imports System.Text
Public Class TCP_IP_Servidor
#Region "ESTRUCTURAS"
Private Structure InfoDeUnCliente
'Esta estructura permite guardar la información sobre un cliente
Public Socket As Socket 'Socket utilizado para mantener la conexion con el cliente
Public Thread As Thread 'Thread utilizado para escuchar al cliente
Public UltimosDatosRecibidos As String 'Ultimos datos enviados por el cliente
End Structure
#End Region
#Region "VARIABLES"
Private tcpLsn As TcpListener
Private Clientes As New Hashtable 'Aqui se guarda la informacion de todos los clientes conectados
Private tcpThd As Thread
Private IDClienteActual As Net.IPEndPoint 'Ultimo cliente conectado
Private m_PuertoDeEscucha As String
#End Region
#Region "EVENTOS"
Public Event NuevaConexion(ByVal IDTerminal As Net.IPEndPoint)
Public Event DatosRecibidos(ByVal IDTerminal As Net.IPEndPoint)
Public Event ConexionTerminada(ByVal IDTerminal As Net.IPEndPoint)
#End Region
#Region "PROPIEDADES"
Property PuertoDeEscucha() As String
Get
PuertoDeEscucha = m_PuertoDeEscucha
End Get
Set(ByVal Value As String)
m_PuertoDeEscucha = Value
End Set
End Property
#End Region
#Region "METODOS"
'Función que devuelve la dirección IP de nuestro equipo "Servidor"
Public Function ObtenerIPLocal() As System.Net.IPAddress
Dim nombreHost As String = System.Net.Dns.GetHostName
Dim hostInfo As System.Net.IPHostEntry = Net.Dns.GetHostEntry(nombreHost)
Dim direccionIP As System.Net.IPAddress = Nothing
For Each ip As System.Net.IPAddress In hostInfo.AddressList
direccionIP = ip
Next
ObtenerIPLocal = direccionIP
End Function
Public Sub Escuchar()
tcpLsn = New TcpListener(ObtenerIPLocal, PuertoDeEscucha)
tcpLsn.Stop()
'Inicio la escucha
tcpLsn.Start()
'Creo un thread para que se quede escuchando la llegada de un cliente
tcpThd = New Thread(AddressOf EsperarCliente)
tcpThd.Start()
End Sub
Public Function ObtenerDatos(ByVal IDCliente As Net.IPEndPoint) As String
Dim InfoClienteSolicitado As InfoDeUnCliente
'Obtengo la informacion del cliente solicitado
InfoClienteSolicitado = Clientes(IDCliente)
ObtenerDatos = InfoClienteSolicitado.UltimosDatosRecibidos
End Function
Public Sub Cerrar(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente
'Obtengo la informacion del cliente solicitado
InfoClienteActual = Clientes(IDCliente)
'Cierro el hilo
CerrarThread(IDCliente)
'Cierro la conexion con el cliente
InfoClienteActual.Socket.Close()
End Sub
Public Sub Cerrar()
Dim InfoClienteActual As InfoDeUnCliente
'Recorro todos los clientes y voy cerrando las conexiones
For Each InfoClienteActual In Clientes.Values
Call Cerrar(InfoClienteActual.Socket.RemoteEndPoint)
Next
End Sub
#End Region
#Region "FUNCIONES PRIVADAS"
Private Sub EsperarCliente()
Dim InfoClienteActual As New InfoDeUnCliente
With InfoClienteActual
While True
'Cuando se recibe la conexion, guardo la informacion del cliente
'Guardo el Socket que utilizo para mantener la conexion con el cliente
.Socket = tcpLsn.AcceptSocket() 'Se queda esperando la conexion de un cliente
'Guardo el RemoteEndPoint, que utilizo para identificar al cliente
IDClienteActual = .Socket.RemoteEndPoint
'Creo un Thread para que se encargue de escuchar los mensaje del cliente
.Thread = New Thread(AddressOf LeerSocket)
'Agrego la informacion del cliente al HashArray Clientes, donde esta la
'informacion de todos estos
SyncLock Me
Clientes.Add(IDClienteActual, InfoClienteActual)
End SyncLock
'Genero el evento Nueva conexion
RaiseEvent NuevaConexion(IDClienteActual)
'Inicio el thread encargado de escuchar los mensajes del cliente
.Thread.Start()
End While
End With
End Sub
Private Sub LeerSocket()
Dim IDReal As Net.IPEndPoint 'ID del cliente que se va a escuchar
Dim Recibir() As Byte 'Array utilizado para recibir los datos que llegan
Dim InfoClienteActual As InfoDeUnCliente 'Informacion del cliente que se va escuchar
Dim Ret As Integer = 0
IDReal = IDClienteActual
InfoClienteActual = Clientes(IDReal)
With InfoClienteActual
While True
If .Socket.Connected Then
Recibir = New Byte(100) {}
Try
'Me quedo esperando a que llegue un mensaje desde el cliente
Ret = .Socket.Receive(Recibir, Recibir.Length, SocketFlags.None)
If Ret > 0 Then
'Guardo el mensaje recibido
.UltimosDatosRecibidos = Encoding.ASCII.GetString(Recibir)
Clientes(IDReal) = InfoClienteActual
'Genero el evento de la recepcion del mensaje
RaiseEvent DatosRecibidos(IDReal)
Else
'Genero el evento de la finalizacion de la conexion
RaiseEvent ConexionTerminada(IDReal)
Exit While
End If
Catch e As Exception
If Not .Socket.Connected Then
'Genero el evento de la finalizacion de la conexion
RaiseEvent ConexionTerminada(IDReal)
Exit While
End If
End Try
End If
End While
Call CerrarThread(IDReal)
End With
End Sub
Private Sub CerrarThread(ByVal IDCliente As Net.IPEndPoint)
Dim InfoClienteActual As InfoDeUnCliente
'Cierro el thread que se encargaba de escuchar al cliente especificado
InfoClienteActual = Clientes(IDCliente)
Try
InfoClienteActual.Thread.Abort()
Catch e As Exception
SyncLock Me
'Elimino el cliente del HashArray que guarda la informacion de los clientes
Clientes.Remove(IDCliente)
End SyncLock
End Try
End Sub
#End Region
End Class
Private Sub WinSockServer_NuevaConexion(ByVal IDTerminal As System.Net.IPEndPoint) Handles WinSockServer.NuevaConexion
'Muestro quien se conecto
MsgBox(" Conectado IP= " & IDTerminal.Address.ToString & ",Puerto = " & IDTerminal.Port & vbCrLf)
End Sub
Private Sub WinSockServer_ConexionTerminada(ByVal IDTerminal As System.Net.IPEndPoint) Handles WinSockServer.ConexionTerminada
'Muestro con quien se termino la conexion
MsgBox(" Desconectado IP= " & IDTerminal.Address.ToString & ",Puerto = " & IDTerminal.Port & vbCrLf)
End Sub
Private Sub WinSockServer_DatosRecibidos(ByVal IDTerminal As System.Net.IPEndPoint) Handles WinSockServer.DatosRecibidos
'Muestro el mensaje recibido
MsgBox(" IP= " & IDTerminal.Address.ToString & ",Puerto = " & IDTerminal.Port & " " & vbCrLf & vbCrLf & WinSockServer.ObtenerDatos(IDTerminal) & vbCrLf)
End Sub
Private Sub Servidor_Closing(ByVal sender As Object, ByVal e As System.ComponentModel.CancelEventArgs) Handles MyBase.Closing
End
End Sub
Private Sub cmdConectar_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdPonerALaEscucha.Click
If IsNumeric(txtPuerto.Text) Then
If CInt(txtPuerto.Text) > 0 Then
With WinSockServer
'Establezco el puerto donde escuchar
.PuertoDeEscucha = CInt(txtPuerto.Text)
'Comienzo la escucha
.Escuchar()
End With
txtMensaje.Enabled = True
txtPuerto.Enabled = False
cmdPonerALaEscucha.Enabled = False
cmdEnviarMensaje.Enabled = True
Else
MsgBox("Introduzca un valor numérico mayor a 0 para el puerto.")
End If
Else
MsgBox("Introduzca un valor numérico para el puerto.")
End If
End Sub
Private Sub cmdSalir_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles cmdSalir.Click
WinSockServer.Cerrar()
End
End Sub
Gracias de antemano.