Foros del Web » Programación para mayores de 30 ;) » Programación General » Visual Basic clásico »

Mensajero lan Cliente/Servidor a la vez, con Winsock

Estas en el tema de Mensajero lan Cliente/Servidor a la vez, con Winsock en el foro de Visual Basic clásico en Foros del Web. Buen dia...Nuevamente por aki...saludos a todos... Bueno mi duda es sobre un mensajero lan con winsock..bueno mi problema es que no se cuantos Winsock debe ...
  #1 (permalink)  
Antiguo 09/06/2006, 13:36
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años, 1 mes
Puntos: 0
Mensajero lan Cliente/Servidor a la vez, con Winsock

Buen dia...Nuevamente por aki...saludos a todos...

Bueno mi duda es sobre un mensajero lan con winsock..bueno mi problema es que no se cuantos Winsock debe de tener para realizar el mensajerito...jejeje

Mi planteamiento es el siguiente, es lo que pretendo hacer pero aun no lo he logrado hacer del todo...espero me den unos cuantos consejos....mas que nada es usar un solo programa que trabaje como servidor y a la vez como cleinte.

Estructura Actual.-

3 controles winsock
WinsockUDP : Local Port=6001
Winsock1 : Local Port=6002,Remote Port =6003
Winsock2 () : Local Port=6003,Remote Port =6002

cajas de texto y un list box.-

Winsock1 siempre a la escucha

Funcionamiento-

1.- El WinsockUDP esta en escucha, dicho WinsockUDP manda un BroadCast mandando un su nombre de usuario, para saber que este usuario se conecto.... por ejemplo

WinsockUDP.sendData (WinsockUDP.Localhostname & "#Usu#")

2.- Al recibir en WinsockUDP el pakete Broadcast en WinsockUDP_DataArrial(...)

recibe y crea un Winsock1(nuevosocket) y Este nuevo socket solicita una conexion al Winsock1 Al recibir el conection_recuest(..) del Winsock1 este Winsock1 crea un nuevo Winsock2(Nuevosock) y acepta la conexion....

Esto para establecer una conexion TCP, y poder usar los eventos close y connect

Cuando el Winsock2(nuevosock) creado por el Winsock1, establece el Connection..este Winsock2(nuevosock) manda su nombre de usuario con sendata....para que dicho usuario que se conecto lo agregue a su lista de usuarios conectados

este es el code que tengo pero no fuenciona del todo....esepro me haya medio explicado

lo que pretendo hacer es el de no depender de un servidor...todo esto es para una lan solamente....

Código:
rivate Sub Form_Load()
On Error Resume Next
Dim Usuario_Udp1 As String
WinSockUDP.Bind
Winsock1.Close
Winsock1.Listen

Usuario_Udp1 = WinSockUDP.LocalHostName & "#Usu#"
WinSockUDP.RemoteHost = "255.255.255.255"

WinSockUDP.SendData Usuario_Udp1



End Sub
Private Sub WinSockUDP_DataArrival(ByVal bytesTotal As Long)
Dim DatosUdp As String
Dim Usuario_Udp As String
WinSockUDP.GetData DatosUdp


Select Case Len(DatosUdp) >= 0

      Case Right(DatosUdp, 5) = "#Usu#"

            
        If Not Usuario_Udp = Winsock1.LocalHostName Then
                  
                    
            numSocket = NuevoSocket
            Winsock2(numSocket).RemoteHost Usuario_Udp
            Winsock2(numSocket).Close
            Winsock2(numSocket).Connect
                    
        End If
                    
    End Select


End Sub
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Dim numSocket As Integer 'el numero del socket

'creamos un nuevo socket
numSocket = NuevoSocket
'aceptamos la conexion con el nuevo socket
Winsock2(numSocket).Accept requestID

End Sub
Private Sub Winsock2_Connect(Index As Integer)
'Me.Caption = "Cliente" & "   -   " & "¡ Conexion Establecida !"
'Me.B_Conectar.Caption = "Desconectar"
Enviar_Datos Winsock2(Index).LocalHostName & "#Usu#", Index


End Sub
Private Sub Winsock2_DataArrival(Index As Integer, ByVal bytesTotal As Long)

'variable para guardar los datos
Dim Datos As String
'obtenemos los datos y los guardamos en una variable

Winsock2(Index).GetData Datos

Select Case Len(Datos) >= 0
  
      Case Right(Datos, 5) = "#Usu#"
                
                User(Index) = (Left(Datos, Len(Datos) - 5))
                Me.Actuliza_Lista
                        
      Case Else
                
  '             Success = FlashWindow(Me.hwnd, 1)
   
    End Select

End Sub

Private Sub Winsock2_Close(Index As Integer)
'cierra la conexion

Winsock2(Index).Close
User(Index) = ""
Me.Actuliza_Lista


End Sub
Private Sub Winsock2_Error(Index As Integer, ByVal Number As Integer, Description As String, ByVal Scode As Long, ByVal Source As String, ByVal HelpFile As String, ByVal HelpContext As Long, CancelDisplay As Boolean)
'cerramos la conexion
Winsock2(Index).Close
'mostramos informacion sobre el error

MsgBox "Error numero " & Number & ": " & Description, vbCritical

End Sub
Private Function NuevoSocket() As Integer

Dim numElementos As Integer 'numero de sockets
Dim i As Integer 'contador

'obtiene la cantidad de Winsocks que tenemos
numElementos = Winsock2.UBound
'recorre el arreglo de sockets

For i = 0 To numElementos
'si algun socket ya creado esta inactivo
'utiliza este mismo para la nueva conexion
        If Winsock2(i).State = sckClosed Then

            NuevoSocket = i 'retorna el indice

            Exit Function 'abandona la funcion

         End If

Next


'si no encuentra sockets inactivos
Load Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo
'devuelve el nuevo indice
NuevoSocket = Winsock2.UBound

End Function


Sub Actuliza_Lista()

Me.Lista_Contactos.Clear
    
    For i = 0 To UBound(User)

      If User(i) <> "" Then Me.Lista_Contactos.AddItem User(i)
          
    Next i


End Sub



Sub Enviar_Datos(Datos_a_Enviar As String, Indice As Integer, Optional Origen As String)
  
  Dim Mensage As String
  
  
      If Origen = "Boton_Enviar" Then
      
                Mensage = Datos_a_Enviar
                
      Else
      
        
                Mensage = Datos_a_Enviar
   
      
      End If
      
   Winsock2(Indice).SendData Mensage

End Sub

Todo las sugerencias son aceptadas.....ha y nos se si usar 4 winsocks, haaaa y otra cosa este code me causa problemas pork me dice que la direccion esta en uso....cuando se conecta otro usuario es decir solo funciona si un usuario se conecta...

bueno gracias por su atencion
  #2 (permalink)  
Antiguo 09/06/2006, 21:19
Avatar de wansoft  
Fecha de Ingreso: mayo-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 81
Antigüedad: 18 años
Puntos: 1
Yo como minimo uso 2 controles winsock, uno de los 2 programas debe ser un servidor ( el que inicia el chat ). Lo malo es que cuando se desconecte se termina el chat.
Es posible hacer que mas usuarios se unan al chat creando una matriz de controles Winsock.
  #3 (permalink)  
Antiguo 12/06/2006, 13:58
5v5
 
Fecha de Ingreso: abril-2005
Ubicación: Huehuetoca, Mexico
Mensajes: 138
Antigüedad: 19 años, 1 mes
Puntos: 0
pues gracias por tu respuesta...

pues miren que si lo hago con 3 winsock..funciona bien...bueno no tan bien...

el problema es que solo acepta una conexion pork en cuento se conecta otro usuario me marca que la direcion esta en uso y se cierra el programa...que es lo que hago mal...seran los puertos..
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 01:25.