Oppure

Loading
25/09/08 8:35
mestesso
Salve VBnettiani!
Mi aiutate a risolvere questo problema?

Ho un server che rimane in ascolto per accettare dati in arrivo in questo modo
tcpListen As New TcpListener(ip, porta)
tcpListen.Start()
tcpClient = tcpListen.AcceptTcpClient()
netStream = tcpClient.GetStream()


E quando il client si disconnette al server uso questo codice
tcpClient.Client.Disconnect(True)
tcpClient.Close()
netStream.Close()
tcpListen.Stop()


Dopodichè rinizializzo il codice precedente per rimettere dinuovo il server in ascolto per accettare un altra connessione

tcpListen As New TcpListener(ip, porta)
tcpListen.Start()
tcpClient = tcpListen.AcceptTcpClient()
netStream = tcpClient.GetStream()


A questo punto il server va in palla e si blocca.

Qualcuno sa dirmi dove sbaglio?
Io ho pensato che forse quando il client si riconnette al server trova la porta occupata e quindi si blocca.

Suggerimenti?

P.S.
Il codice è in VB.NET, non in php come dice il forum :-)
Ultima modifica effettuata da mestesso 25/09/08 8:37
aaa
25/09/08 9:18
pierotofy
Io proverei ad invertire l'ordine:

netStream.Close()
tcpClient.Client.Disconnect(True)
tcpClient.Close()
tcpListen.Stop() 
Il mio blog: piero.dev
25/09/08 13:58
mestesso
Postato originariamente da pierotofy:

Io proverei ad invertire l'ordine:

netStream.Close()
tcpClient.Client.Disconnect(True)
tcpClient.Close()
tcpListen.Stop() 


No purtroppo non va. In questo modo invece di bloccarsi mi restituisce errore.
Ultima modifica effettuata da mestesso 25/09/08 13:58
aaa
25/09/08 14:46
Il Totem
In teoria dovresti usare lo stesso listener e non inizializzarne uno nuovo. Inoltre, non capisco perchè la prima volta non ti si blocchi: la funzione AccectTcpClient dovrebbe funzionare solo se c'è una connessione in attesa e bloccarti se non ce ne sono.
aaa
25/09/08 23:15
mestesso
Postato originariamente da Il Totem:

In teoria dovresti usare lo stesso listener e non inizializzarne uno nuovo. Inoltre, non capisco perchè la prima volta non ti si blocchi: la funzione AccectTcpClient dovrebbe funzionare solo se c'è una connessione in attesa e bloccarti se non ce ne sono.


Se uso lo stesso listener alla seconda connessione mi sembra che la porta risulta occupata.
In effetti mi si blocca anche la prima volta, però fila tutto liscio, è alla seconda connessione che oltre a bloccarsi non si sblocca più.
Ora sto cercando qualche source in VB.NET in giro per la rete per capire il meccanismo dei server.
Se qualcuno sa gia dove posso trovarne uno è ben accetto se me lo linka :-)
Ultima modifica effettuata da mestesso 25/09/08 23:17
aaa
26/09/08 13:30
Il Totem
Ma se tieni lo stesso listener non può dare porta occupata. Basta che lo fermi (Stop) quando non ti serve e lo riattivi (Start) quando ne hai bisogno.
Non puoi - o meglio, non dovresti - richiamare AcceptTcpClient subito dopo Start(), perchè l'ascolto è un'operazione asicrona: dovresti invece usare un timer che controlla ogni volta SE ci sono connessioni (cosa che tu dai per scontato) e in quel caso, inizializzi il client.
aaa
26/09/08 22:28
mestesso
Si utilizzo un timer ma forse non lo utilizzo nella maniera giusta.
Vediamo se riuscirò a mettere a posto.
aaa
27/09/08 10:06
mestesso
Mizzega ho risolto ahhh!
Mi ero dimenticato di inserire nel timer questo:
if tcpListen.Pending() then
eccetera eccetera

adesso funziona tutto senza problemi.
Grazie per avermi dato l'illuminazione!
aaa