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