Hola, bienvenido al foro, primera sugerencia vos llamas a los controles proxy, envia y recibe lo cual es un poco confuso porque no se entiende que es cada palabra, es mejor que pongas un prefijo por ejemplo WsProxy, WsEnvia, WsRecibe.
tambien es bueno que identes el codigo y utilizes Option Explicit
despues el error es porque no trabajas con array de sokets, lo que pasa es lo siguiente, en el evento proxy_ConnectionRequest se situan varias peticiones en menos de un segundo esto es porque los navegadores trabajan con multihilos es decir estan manejando mas de una conexion simultanea a la vez suponete vos cargas esta pagina y por cada imagen que ves es una conexion independiente tambien tene en cuenta que esta pagina tiene un css y seguramente algun script que carga, entonces esas son todas penticiones que va haciendo el navegador en un mismo tiempo, y vos solo manejas una la del envia y recibe lo cual cuando se dispara el evento proxy_ConnectionRequest llamas a
envia.Close
envia.Accept requestID
pero cuando en menos de un segundo llega otra petición el "envia" aun no termina de procesar la primera y el evento obliga a cerrar la primera conexion
entonces como solucionas esto, pues con array de controles de envia() , recibe() y getdatos() entonces cada vez que se dispare un enevnto evento proxy_ConnectionRequest asigna a un control de array envia() , recibe() y a la variable getdatos() la pecitcion entrante
entonces en la propiedad index de WsEnviar y el WsRecibe le pones "0" (en tiempo de diseño) y pegas este codigo
Option Explicit
Dim sGetDatos() As String
Private Sub Form_Load()
Dim i As Long
'leemos 255 controles incluyendo el 0 serian 256 peticones de cada winsock
For i = 1 To 255
Load WsEnvia(i)
Load WsRecibe(i)
Next
'redimencionamos la variable para almacenar las cabezeras
ReDim sGetDatos(255)
WsProxy.Close
WsProxy.LocalPort = 8080
WsProxy.Listen
End Sub
Private Sub WsProxy_ConnectionRequest(ByVal requestID As Long)
Dim Index As Integer
Dim i As Long
'Buscamos un soket libre
For i = 0 To 255
If WsEnvia(i).State = sckClosed And WsRecibe(i).State = sckClosed Then
Index = i
Exit For
End If
Next
Debug.Print Now, "Request", Index
sGetDatos(Index) = vbNullString
WsEnvia(Index).Close
WsEnvia(Index).Accept requestID
End Sub
Private Sub WsEnvia_Close(Index As Integer)
WsEnvia(Index).Close
WsRecibe(Index).Close
End Sub
Private Sub WsEnvia_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim sDatos As String
WsEnvia(Index).GetData sDatos
sGetDatos(Index) = sGetDatos(Index) & sDatos
'esperamos a que se termine de completar la cabezera
If InStr(sGetDatos(Index), vbCrLf & vbCrLf) Then
Call EnviarRespuesta(Index, sGetDatos(Index))
End If
End Sub
Private Function EnviarRespuesta(Index As Integer, sDatos As String)
Dim omg As urlinfo
omg = getinfor(sDatos)
WsRecibe(Index).Close
WsRecibe(Index).Connect omg.url, omg.port
Debug.Print Now, "Connect", omg.url, omg.port
End Function
Private Sub WsEnvia_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)
WsRecibe(Index).Close
WsEnvia(Index).Close
Debug.Print Now, "Error", Number, Description
End Sub
Private Sub WsRecibe_Connect(Index As Integer)
WsRecibe(Index).SendData sGetDatos(Index)
sGetDatos(Index) = vbNullString
End Sub
Private Sub WsRecibe_DataArrival(Index As Integer, ByVal bytesTotal As Long)
Dim sDatos As String
WsRecibe(Index).GetData sDatos
WsEnvia(Index).SendData sDatos
End Sub
funciona bastante bien con paginas comunes pero las que tienen contenidos de video falla, no me puse a ver mucho en detalle pero bueno funciona mejor. (tampoco lo probe fuera de la pc es decir con 127.0.0.1)