obtener index de winsock

Iniciado por ..::[ thekingkid ]::.., 17 Agosto 2006, 20:34 PM

0 Miembros y 1 Visitante están viendo este tema.

..::[ thekingkid ]::..

buenas... las tengas he aki un problema que me surgio y no he logrado resolver.. espero me puedan ayudar se agradece desde ante mano




tengo un winsock al que llame sock1
que permite varias conexiones al mismo puerto...

CitarPrivate Sub sock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Sock1(Index).Close
Sock1(Index).Accept requestID
TxtConectados.AddItem Sock1(Index).RemoteHostIP & ":" & Sock1(Index).LocalPort & ":" & Conexiones
CCliente.AddItem Conexiones
Text2.Text = Conexiones
Conexiones = Conexiones + 1
Load Sock1(Conexiones)
Sock1(Conexiones).LocalPort = TxtPuerto.Text
Sock1(Conexiones).Listen

end sub

entonces a toda mandarina se conectan varios etc etc
pero no e logrado hacer que se borren de la lista cuando se desconecten.... he intentado en el metodo  winsock_close()
pero no funciona lo he intentado de esta manera

CitarPrivate Sub Sock1_Close(Index As Integer)
TxtConectados.RemoveItem Sock1(Index).Tag


End Sub



entonces como obtengo el numero de el sock  que se ha cerrado...    tambien he intentado con un timer que  cheque el estado del sock(#sock).state=7 entonces que lo deje pero
si es diferente de 7 que lo quite de la lista como hacerlo gracias!!!!!!!!!!!!1





just wanna try

n3ts4mura1

Haber si esto te sirve:

Private Sub ws_ConnectionRequest(index As Integer, ByVal requestID As Long)
    Dim actIndex    As Integer
    Dim strData     As String
    On Local Error Resume Next
    Err.Clear
    '//Un usuario solicita nueva conexión y verificamos que se realiza
    '//a través del canal 0 de WS que es el servidor a la escucha.
    If index = 0 Then
        If freeSockets.Count <> 0 Then
            actIndex = freeSockets(1)
            freeSockets.Remove 1
            '//Aceptar conexión recuperando hilo
            users(actIndex) = ""
            rqs(actIndex) = CStr(requestID)
            ws(actIndex).LocalPort = 0
            ws(actIndex).Accept requestID
        Else
            idServer = idServer + 1
            actIndex = idServer
            '//Aceptar conexión en nuevo hilo
            ReDim Preserve users(1 To actIndex)
            ReDim Preserve rqs(1 To actIndex)
            users(actIndex) = ""
            rqs(actIndex) = CStr(requestID)
            Load ws(actIndex)
            ws(actIndex).LocalPort = 0
            ws(actIndex).Accept requestID
        End If
    End If
    '//preparar cadena de identificación
    strData = "[REQUEST]|" + CStr(requestID)
    sendSERVER actIndex, strData
End Sub

..::[ thekingkid ]::..

grax  pero no entendi mucho deja verlo mas detallado saludos!!!!
just wanna try

Castord

Ese problema lo tuve yo y lo solucione  una condicional anidada que comparaba el texto de la lista con el ip de la maquina desconectada. Cada la  item de mi lista tiene un ip y un separador que con un simple algoritmo de descomposicion de cadenas que compara cada string. El drama surge con la tendencia de evento a repetirse indefinidamente.
Desarrola esa idea si te parece. A mi me funciono.
Desde Asunción - Paraguay
/*Es una ***** pero igual amo mi país!*/

..::[ thekingkid ]::..

perdon que me quede ausente por unos dias por el trabajo... pero he tenido un tiempo y pos yo esto habia pensado


el el conexion reques del winsock  puse esto
pero antes les xplico
sock1= un winsock
txtconectados= un listbox
ccliente= un combox
text2.= otra caja de texto
conexiones= una variable tipo integer (entera)
he aki el codigo (aki todo bien)
cuando algun cliente se conecta se le añade a  el listbox txtconectados  se le añade la ip remota y el puerto local y el numero de index que le toco
y luego al combox ccliente se le añade el index del winsock con el que se ha conectado osea que si ya habia ocupado el 1 seguia entonces el 2 etc etc etc
a el text2.text tambien se le pone el numero de la variable conexiones (para que veamos cuantos clientes se han conectado y para que el timer tome su valor y  cheque el estado) luego se abre otro sock y se pone a la escucga de aki
todo bien

Private Sub sock1_ConnectionRequest(Index As Integer, ByVal requestID As Long)
Sock1(Index).Close
Sock1(Index).Accept requestID
TxtConectados.AddItem Sock1(Index).RemoteHostIP & ":" & Sock1(Index).LocalPort & ":" & Conexiones
CCliente.AddItem Conexiones
Text2.Text = Conexiones
Conexiones = Conexiones + 1
'creamos otro socket para escuchar
Load Sock1(Conexiones)
Sock1(Conexiones).LocalPort = TxtPuerto.Text
Sock1(Conexiones).Listen

end sub

luego..... entonces utilizo un timer para comprobar el estado de cada uno de los index del sock  con el text2 este toma el valor de cada vez que se conecta el el sock conexion request
ahi esta.:


timer1_timer()
on error goto error

if text2.text=0 then
      if sock1(0).state=7 then
     
      else
      txtconectado.removeitem 0
      end if
else

      if sock1(text2.text).state=7 then
         else
          txtconectados.removeitem text2.text
         end if
end if
pero el caso el que  aunque esta conectado quita todos los que estan en el listado de el txtconectados(listbox) por que no se si obtiene otro index o????  ahi el problema espero que hayan entendido el code


exit sub
error:

end sub














just wanna try

MANULOMM

hola, lo que debes hacer es dejarlos abiertos, y antes de que se conecte un nuevo cliente el servidor verifique si hay alguno abierto
para ocuparlo
asi:

'Carga un nuevo socket al arreglo y devuelve su indice
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
    'crea uno nuevo y devuelve su identidad
    Load Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo
    'devuelve el nuevo indice
    NuevoSocket = Winsock2.UBound
End Function

recuerda que la instrcuccio Winsok1.close tansolo cierra la conexion, no cierra el winsock

Atentamente

JUAN MANUEL LOMBANA
MEDELLÍN - COLOMBIA