Problemi socket asincroni

mercoledì 07 giugno 2006 - 16.30

zanca Profilo | Newbie

Salve a tutti,
ho implementato una struttura client/server di tipo asincrono, secondo il
codice di esempio che ho trovato in msdn, e ho il seguente problema, credo
lato client.
Quando faccio la prima connessione ottengo la stringa e va tutto bene, senza uscire dall' applicazione, faccio un' altra connessione al server per avere un' altra stringa ma ho un comportamento anomalo del codice (credo) lato client :

La struttura principale del codice è la seguente:

' Create a TCP/IP socket.
Dim client As New Socket(AddressFamily.InterNetwork,
SocketType.Stream, ProtocolType.Tcp)

' Connect to the remote endpoint.
client.BeginConnect(remoteEP, New AsyncCallback(AddressOf
ConnectCallback), client)

' Wait for connect.
connectDone.WaitOne()

' Send test data to the remote device.
Send(client, richiesta)
sendDone.WaitOne()

' Receive the response from the remote device.
ReceiveLicenze(client)
receiveDone.WaitOne()

' Write the response to the console.
'Console.WriteLine("Response received : {0}", response)


' Release the socket.
client.Shutdown(SocketShutdown.Both)
client.Close()



ometto di riportare le chiamate asincrone ai metodi(ConnectCallBack,
SendCallBack, ReceiveCallBack che sono le stesse degli esempi in msdn).

La prima richiesta segue correttamente i thread e le chiamate asincrone.

La seconda volta che devo inviare e ricevere una stringa invece il codice
client di cui sopra segue un cammino errato (analizzato tramite debug) e va
in eccezione: prima entra in connectcallback esce subito e va nel thread
principale invocando

client.Shutdown(SocketShutdown.Both)
client.Close()

esce e fa un percorso attraverso i metodi diverso dalla prima chiamata.

Chiaramente chiudendo la connesione e le risorse non può più trasmettere e
deve andare in eccezione, infatti, quando arriva a

Dim bytesRead As Integer = client.EndReceive(ar)

all' interno di

ReceiveConnectCallcack

ho il seguente errore :

Eccezione non gestita di tipo: System.ObjectDisposeException in System.dll.
Impossibile accedere all' oggetto eliminato di nome
"System.Net.Sockets.Socket"

Qualcuno sa dirmi dov'è il problema?

Grazie!

blood Profilo | Senior Member

Il problema è che dovresti usare due socket differenti oppure non chiuderlo il socket che usi all'inizio perchè dopo averci fatto il close e lo shutdown rimane sempre inizializzato ma con le proprietà Avaiable, LocalEndPoint e RemoteEndPoint in Error...io ho risolto mettendolo a nothing dopo averlo chiuso e con un controllo posteriore che se è Nothing zompa o ri inizializza un nuovo socket

ps: premetto che da poco uso i socket, probabilmente non è la soluzione migliore...visto che anche io ho qualche problemino con essi
---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)

zanca Profilo | Newbie

Guarda ho provato un pò in tutte le maniere compresa la tua,e sinceramnete non sono arrivato ad una soluzione.
Ho utilizzato dei thread.sleep(2000) posizionati nel send e prima del client.close e funziona per quasi tutte le richieste di stringhe , ma per alcune,elaborate dal server in modo differente, mi da lo stesso errore.
Credo sia dovuto anche a problemi di sincronia tra differenti pc...(quindi differenti velocità di elaborazione) ma il problema non si dovrebbe porre utilizzando il paradigma asincorno e invece nada!
Riguardo al motivo preciso di questo comportamento non l'ho ancor capito, solo supposizioni per ora.
La cosa che mi infastisce e no poco e che se chiudo l'applicazione del client prima di fare la richiesta una seconda volta il problema non si pone, allora uno pensa: metto una GC.Collect alla fine e dovrebbe essere lo stesso, e invece no!
Misteri dell' informatica?
Poi navigando nella rete in cerca di soluzioni sono arrivato a questo sito:
http://www.thinktecture.com/Resources/RemotingFAQ/RemotingUseCases.html
Magari ti può essere utile.

Ti ringrazio per la risposta cmq!

blood Profilo | Senior Member

>Guarda ho provato un pò in tutte le maniere compresa la tua,e
>sinceramnete non sono arrivato ad una soluzione.
>Ho utilizzato dei thread.sleep(2000) posizionati nel send e
>prima del client.close e funziona per quasi tutte le richieste
>di stringhe , ma per alcune,elaborate dal server in modo differente,
>mi da lo stesso errore.
>Credo sia dovuto anche a problemi di sincronia tra differenti
>pc...(quindi differenti velocità di elaborazione) ma il problema
>non si dovrebbe porre utilizzando il paradigma asincorno e invece
>nada!
>Riguardo al motivo preciso di questo comportamento non l'ho ancor
>capito, solo supposizioni per ora.
>La cosa che mi infastisce e no poco e che se chiudo l'applicazione
>del client prima di fare la richiesta una seconda volta il problema
>non si pone, allora uno pensa: metto una GC.Collect alla fine
>e dovrebbe essere lo stesso, e invece no!
>Misteri dell' informatica?
>Poi navigando nella rete in cerca di soluzioni sono arrivato
>a questo sito:
>http://www.thinktecture.com/Resources/RemotingFAQ/RemotingUseCases.html
>Magari ti può essere utile.
>
>Ti ringrazio per la risposta cmq!

Do not use client-activated objects and don't pass any MarshalByRefObject over a remoting boundary. You will easily trap this if you use the .NET Framework version 1.1 which will throw a SecurityException or a SerializationException in this case. (Yes, you could change this setting - but you shouldn't!)

...pare proprio che qualcosa non và con questo framework...cmq scusa il tuo problema non era che tentavi ad accedere ad un elemento eliminato? (il socket esisteva ma aveva le proprietà in error, quindi dopo la close e la shutdown ti avevo consigliato di puntarlo direttamente a Nothing, cosicchè dall'altra parte confrontavi se non era Nothing, e se lo era lo ri istanziavi) cosi non hai risolto?? comunque bene...mi fa piacere che mi hai anticipato con i thread e non hai risolto uguale...appena avrò due minuti di tempo lo provo anche io e ti farò sapere...

---------------
Piscopo Paolo

:: wD @ IRCnet :: .NET wannabe 8-)
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5