Newsgroup: it.comp.lang.visual-basic
Titolo: Errore di indirizzo già in uso in Wins ock

Ciao a tutti,
sto contruendo un oggetto multisocket che è composto da due parti Server e Client.
Il primo si occupa di ricevere le richieste di connessione da altri oggetti, i Client si 
occupano della connessione ad altri oggetti.
Il mio problema è che, se ho una connessione attiva su un client su una porta (es. 5000) e 
la chiudo, quando tento di riaprirla sulla stessa porta mi si solleva un errore di 
"indirizzo già in uso" come se quando chiudo il socket (Wclient.Close) lui non rilasciasse 
la porta.
In effetti, se vado a vedere le connessioni con il comando NETSTAT, vedo che la 
connessione su questa porta è in TIME_WAIT.
Sul sito comune, ho trovato un esempio di IstantMessenger di Nicola Ottomano che, nel 
codice scrive:
******************************************************************************************
     'ATTENZIONE: queste due istruzioni sono MOLTO importanti.
     'Queste due istruzioni servono per eliminare un bug (o almeno sembra tale) del controllo
     'Winsock che genera un errore (Indirizzo già in uso) quando, dopo aver chiuso una
     'connessione, si tenta di riaprirne un'altra con lo stesso server.
     'Io non sono riuscito ad eliminare il problema se non con questo trucchetto.
     'Se riuscite a fare diversamente, ditemelo!
     'Provate a commentare queste due istruzioni per vedere...
     Unload WSCK(1)
     Load WSCK(1)
******************************************************************************************
Qualcuno sa se è effettivamente è un bug del controllo??
Siccome io ho un array di socket (e quindi non posso scaricare il Socket(0)) se fosse 
davvero un bug sarei rovinato!!
Ciao!!

 connessione su questa porta è in TIME_WAIT.
In che modo chiudi la connessione? con "close"?

 
Si, se chiudo la connessione dal client i-esimo con WClients(i).Close, se la chiudo dal 
server i-esimo con WServers(i).Close.

 porta.
Prova magari a svuotare le proprieta' indirizzo e porta e a riassegnarle
prima di riaprire.
Magari in questa maniera il controllo riesce a "svegliarsi".
--
Starman

 Magari in questa maniera il controllo riesce a "svegliarsi".
Alle brutte, con lo stesso controllo apri un'altra porta fittizia e poi
torni sulla porta su cui lavoravi.
Certo non e' il massimo, ma se proprio non puoi fare l'unload...
--
Starman

 Certo non e' il massimo, ma se proprio non puoi fare l'unload...
Mmmm...in effetti non è molto elegante...anche perchè mi troverei comunque una porta in 
TIME_WAIT.
Il "bello" è che Microsoft suggerisce di usare il controllo con LocalPort=0 in modo che 
sia lui a scegliersi una porta sempre diversa!! Bella pezza!!!

Ti spedisco una funzione che uso nel mio instant messenger. Spero ti possa
essere d'aiuto:
Function DoConnect() As Boolean
On Error GoTo errore
     Dim t As Single
    'connetti
    If ws.State <> sckClosed Then ws.Close
    frmMaster.stsBar.Panels("WhatsUp").Text = "Tentativo di connessione a "
& Host & " ..."
    DoEvents
    t = Timer
    ws.Connect Host, 1000
    While Timer < t + 10 And ws.State <> sckConnected
        DoEvents
    Wend
    If ws.State <> sckConnected Then
        ws.Close
        frmMaster.stsBar.Panels("WhatsUp").Text = "Disconnesso"
        MsgBox "Tentativo di connessione fallito", vbCritical, "Timeout"
        Me.Caption = "Disconnesso - Host: " & Host
        DoConnect = False
    Else
        frmMaster.RefreshConn 1
        frmMaster.stsBar.Panels("WhatsUp").Text = "Connesso"
        Me.Caption = "Connesso - Host: " & Host
        DoConnect = True
    End If
    Pause 1
    frmMaster.stsBar.Panels("WhatsUp").Text = "Listening"
Exit Function
errore:
    MsgBox Err.Number & ":" & Err.Description
End Function
Per maggiori info scarica l'Instant Messenger dal Sito Comune
(
www.it-lang-vb.net
)
bye
-- 
Esistono 10 tipi di persone: chi conosce il binario e chi no.
"Seminate Linux, che Windows si pianta da sè...." (Antico Adagio)
Gestione Ottica - Gestionale per Ottici e Programmi Gratuiti su:
http://www.nicolaottomano.it

Ottomano Nicola ha scritto:
 > Ti spedisco una funzione che uso nel mio instant messenger. Spero ti possa
 > essere d'aiuto:
 > ...
 >
 > Per maggiori info scarica l'Instant Messenger dal Sito Comune
 > (
www.it-lang-vb.net
)
 >
 > bye
Ti ringrazio!
Ma vedi il mio problema non è tanto la connessione, ma il fatto che il controllo, una 
volta disconnesso ponga la porta in TIME_WAIT.
Potrei fregarmene e aprire una porta diversa ad ogni connessione (cosa che sto attualmente 
facendo), ma 'sta cosa mi scoccia!!!

Finalmente sono riuscito a farmi chiarezza su quest'argomento!!
Per inciso ho trovato questo articolo nella Knowledge Base di Microsoft:
http://support.microsoft.com/default.aspx?scid=kb;en-us;137984
Che alla fine riporta:
**************************************
NOTE: It is normal to have a socket in the TIME_WAIT state for a long period of time. The 
time is specified in RFC793 as twice the Maximum Segment Lifetime (MSL). MSL is specified 
to be 2 minutes. So, a socket could be in a TIME_WAIT state for as long as 4 minutes. Some 
systems implement different values (less than 2 minutes) for the MSL.
**************************************
Quindi basta aspettare un tempo pari al MSL e poi la porta viene liberata!
Ciao a tutti e grazie per i consigli!