El tema es que un winsock no puede estar conectado con mas de 1 winsock a la vez. Asique si usas winsocks tenés que hacer un function que cree un nuevo winsock cada vez que alguien se conecte. Para esto podes hacer lo siguiente:
Crear 2 winsocks, un Winsock1 que va a recibir las conexiones y las va a asignar a otro winsock, y el Winsock2 como un Array de controles.
El cuando un cliente trata de conectarse, el winsock1 la recibe, si en el array de controles del winscok2 hay alguno libre, se lo asigne, en caso contrario, crea uno nuevo en el array. Para hacer esto te dejo el siguiente código que es el que uso yo y lo encontre en un manual por la web:
Public Function NuevoSocket() As Integer
Dim numElementos As Integer 'numero de sockets
Dim i As Integer 'contador
'obtiene la cantidad de Winsocks que tenemos
numElementos = frmMain.Winsock2.UBound
'recorre el arreglo de sockets
For i = 0 To numElementos
'si algun socket ya creado esta inactivo
If frmMain.Winsock2(i).State = sckClosed Then
'utiliza este mismo para la nueva conexion
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 frmMain.Winsock2(numElementos + 1) 'carga un nuevo socket al arreglo
'devuelve el nuevo indice
NuevoSocket = frmMain.Winsock2.UBound
End Function
Y en el Winsock1, en el sub de ConnectionRequest deberias poner lo siguiente:
Private Sub Winsock1_ConnectionRequest(ByVal requestID As Long)
Dim numSocket As Integer 'el numero del socket
'Hacemos una llamada a la function NuevoSocket
numSocket = NuevoSocket
'aceptamos la conexion con el nuevo socket
Winsock2(numSocket).Accept requestID
End Sub
El codigo que dejo aaronduran2 hace algo muy parecido, pero no se fija si alguno de los winsocks antes creados esta ahora libre, por lo que sigue acumulando winsocks.
De todos modos el codigo que yo deje tampoco es el perfecto, lo ideal seria que cada vez que una víctima se conecta se cree un nuevo winsock, y cuando se desconecta se borre.
Salu2