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
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
grax pero no entendi mucho deja verlo mas detallado saludos!!!!
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.
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
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