Newsgroup: it.comp.lang.visual-basic
Titolo: [? lungo] Sincronizzazione Winsock

Ciao a tutti,
 questo in breve il mio problema: sto cercando di realizzare un qualcosa che
assomigli ad un proxy in VB, per curiosità più che per necessità.
 Il problema è che il server http manda i dati in 1 o più pacchetti e poi
chiude la connessione, ed io dovrei fare lo stesso, solo che cio' avviene
mentre sto inoltrando i dati al browser e succede un gran casino perchè
alcuni eventi li perdo ed a volte capita che mi rimangano delle connessioni
zombi che non si chiudono se non manualmente.
    Questa la struttura del programma:
                                "Proxy"
http Server    |    Client             Server     |    browser
porta 6588    |    porta 6588  | porta 80   |    porta 80
locale            |                       |                 |
(scaricato      |                                         |
da sito           |
comune)        |
Ora il Browser invia la richiesta ed il proxy la cattura
Private Sub tcpMaster_ConnectionRequest(ByVal requestID As Long)
'MASTER riceve una richiesta di connessione. Crea una nuova
'instance di servWin e passa il controllo al controllo WS
Caption = "Proxy: connessione da " & tcpMaster.RemoteHostIP
Dim servWin As New frmSock
servWin.Connect requestID
servWin.Show
End Sub
non ho trovato modo più elegante di impaccare 2 controlli Winsock
Il server riceve la richiesta di connessione
Private Sub tcpServer_ConnectionRequest _
(ByVal requestID As Long)
' Verifica se il valore della proprietà State
' è sckClosed. In caso contrario, chiude la
' connessione prima di accettare quella nuova.
If tcpServer.State <> sckClosed Then _
tcpServer.Close
' Accetta la richiesta con il parametro
' requestID.
tcpServer.Accept requestID
bSendCompleted = False
End Sub
Arrivano i dati dal browser
Private Sub tcpServer_DataArrival(ByVal bytesTotal As Long)
If bytesTotal <> 0 Then      ' QUALCUNO MI SPIEGHI PERCHE' ARRIVANO DEI
PACCHETTI VUOTI!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    ReDim outBuffer(bytesTotal)
    tcpClient.Connect
    While tcpClient.State <> sckConnected 'Attendo che sia connesso
         Select Case tcpClient.State
              Case sckError: MsgBox "Errore"
              Case Else:    DoEvents
         End Select
    Wend
    bSendCompleted = False
    'txtDebug = "Server: dati in arrivo"
    tcpServer.GetData outBuffer, vbArray + vbByte, bytesTotal
    tcpClient.SendData outBuffer  'INVIO i DATI all'HTTP SERVER
Else
    DoEvents
End If
End Sub
Arriva la pagina HTML o l'immagine dal server HTTP
Private Sub tcpClient_DataArrival _
(ByVal bytesTotal As Long)
If bytesTotal <> 0 Then   'SPIEGATEMI ANCHE QUESTA
    bSendCompleted = False
    ReDim inBuffer(bytesTotal)
    tcpClient.GetData inBuffer, vbArray + vbByte, bytesTotal
    tcpServer.SendData inBuffer  ' RIMANDA AL BROWSER PER LA VISUALIZZAZIONE
Else
    MsgBox "Arrivo 0"
End If
End Sub
Attendo la fine del trasferimento dati...
Private Sub tcpServer_SendComplete()
bSendCompleted = True
End Sub
attendo che l'HTTP server chiuda la connesione e quando cio' succede
Private Sub tcpClient_Close()
Dim i As Integer
While Not bSendCompleted  'ATTENDO LA FINE DELL'INVIO DEI DATI AL BROWSER
    DoEvents
Wend
tcpClient.Close   'CHIUDO
tcpServer.Close
Unload Me
end sub
Problemi: a volte capita che si chiuda prima che abbia terminato di spedire
i dati al browser, altre che non finisca mai l'invio e non si chiuda, un
casino...
Tutto si verifica con pagine piuttosto complesse dove il browser avvia una
15 ina di richieste in rapida successione, meno con pagine brevi e semplici.
Chi ci caspisce qualcosa è ben venuto...
PS: la tecnica usata nell'HTTP server delle attese a tempo, piuttosto che
sullo stato della connesione, prima di inviare i dati mi sembrano un'utopia
Grazie
--
V. Roccasalvo
email:
vrocca.no
%
sp...@iname.no
%
spam.com
rimuovere i no%spam dall'indirizzo prima di scrivere.

Vedi prima...
Ciao