Newsgroup: it.comp.appl.access
Titolo: Collegamento via socket tcp che dopo 10 secondi si stacca

Procedura Access, che chiamero' A, al suo interno dispone di un socket 
tcp server realizzato usando MsWinsck.dll
Il codice e' il classico:
 
--------------------------------------------------
Set tcpServer = New MSWinsockLib.Winsock
tcpServer.Protocol = sckTCPProtocol
tcpServer.LocalPort = Me.txtPorta
tcpServer.Listen
 
E poi quando c'e' la richiesta connessione:
tcpServer.Accept requestID
 
E quando arrivano dati:
tcpServer.GetData stringa_dati
--------------------------------------------------
 
E programma esterno che chiamero' B, in esecuzione sullo stesso pc dove 
sta girando A, che si collega come 'socket client' e scambia dati
Bene, funziona tutto, il programma esterno si collega e chiacchera 
correttamente con la procedura Access
C'e' un problema pero' quando la procedura Access e' 'impegnata' a fare 
qualcosa, come una query lunga o comunque un'operazione che dura piu' di 
10 secondi, la connessione via socket viene interrotta
Poi quando la query e' finita ed il controllo ritorna al programma 
allora riparte anche la connessione
 
La domanda e':  quel tempo di 10 secondi, dopo il quale se il codice sta 
lavorando e non rilascia il controllo viene interrotta la connessione, 
e' modificabile?

Non so se parliamo dello stesso Winsock in quanto io usavo un Ocx e nonnla DLL che se non ricordo male era pubblicata su VBAccelerator... quindi resto un poco nel dubbio.
 
Temo tuttavia ci sia qualche cosa che non torna... hai dichiarato la variabile tcpServer ereditando gli eventi e tracciando l'evento ERROR...?
Credo appunto che vada in errore, in quel caso basta intercettare l'errore e farla ripartire...
 
Se ho frainteso nin ho modo di replicare il problema...
 
@Alex


Si hai ragione, e' l'ocx non una dll
Ma in tutti gli esempi trovati non vedo l'evento ERROR
Trovo:
- ConnectionRequest
- Close
- DataArrival
 
Ho provato a metterci un
 
Sub tcpServer_Error()
End Sub
 
ma spara fuori subito un errore dicendo di non conoscere l'evento
Sei sicuro ci sia anche l'evento ERROR?


Roberto, per il codice che hai scritto... secondo me è un componente COM quello che usi, ovvero una Dll Activex, e non un OCX da inserire nella Form come Oggetto, altrimenti non avresti questa dichiarazione:
Set tcpServer = New MSWinsockLib.Winsock 
 
Quindi credo tu abbia dichiarato la variabile [tcpServer] As MSWinsockLib.Winsock...?
In questo caso devi, come ti ho accennato sopra, dichiararne anche l'eredità di Eventi con WithEvents
 
Private WithEvents tcpServer As MSWinsockLib.Winsock
 
Se usi la dichiarazione tardiva definendolo Object non puoi e perdi gli eventi... una volta fatto l'Oggetto [tcpServer] espone non solo proprietà e metodi ma anche Eventi, ed apparirà Error...
 
Purtroppo non ho alcun modo di verificare e vado molto a memoria... e logica, spero sia la strada giusta.
 
@Alex


Ho seguito questo esempio
 
http://m-aybs.blogspot.com/2017/03/tutorial-pembuatan-tools-chating-client.html
 
 
Prima carichi tra i Riferimenti  c:\windows\syswow64\msWinsck.ocx
Poi nel codice della form, come da esempio sopra, ho messo la 
dichiarazione variabile tcpServer in questo modo:
 
Private WithEvents tcpClient As MSWinsockLib.Winsock
 
Poi nel restante codice ho inserito le tre procedure per intercettare 
gli eventi disponibili, e quindi:
 
Sub tcpServer_ConnectionRequest()
Sub tcpServer_DataArrival()
Sub tcpServer_Close()
 
E nel restante codice, alla pressione di un tasto, le istruzioni per la 
'messa in servizio' del server
 
Set tcpServer = New MSWinsockLib.Winsock
tcpServer.Protocol = sckTCPProtocol
tcpServer.LocalPort = Me.txtPorta
tcpServer.Listen
 
Ora, dirti cosa sia esattamente la libreria usata, se un componente com 
o una libreria di altro tipo, non lo so con precisione
Fatto sta che quando il restante codice entra in qualche loop 
particolarmente lungo, la connessione col client esterno viene meno dopo 
circa 10 secondi, e vorrei capire chi/dove si decidono questi 10 secondi 
per modificarli aumentandoli

Ho capito... quello che vuoi fare tu non si può fare, ma forse lato SERVER potresti testare la Connection, quì trovi una spiegazione abbastanza pertinente in un sistema Client-Server:
https://www.vbforums.com/showthread.php?743903-RESOLVED-Winsock-Problem
 
 
Se questo non è utile, temo ti servirà implementare un sistema di INVIO "SPAM" per mantenere la connessione, da scartare dal Client ovviamente, ma quì entra poi il problema dell'impossibilità di Access di gestire il MultiThread... di conseguenza, devi assicurarti che, nel codice che tu chiami LOOP LUNGO, ci sia SEMPRE un DoEvents che consente al S.O. ed al codice MonoThread di eseguire le azioni prioritarie.
 
Di più non so aggiungere non potendo fare prove fisiche.
 
@Alex


Gia'
Grazie per l'aiuto


Ciao,
hai valutato di lanciare una applicazione Access secondaria che faccia solo quello, a mo di servizio?
 
Il problema della mancanza del multithread in access inizia a diventare effettivamente un problema.
 
Questo, insieme a una gestione molto più intelligente ed elastica delle tabelle SQL collegate con ODBC dovrebbero essere, a mio giudizio, le più urgenti innovazioni da inserire in Access.
 
Ciao
Davide


Considerato il fatto che i 'blackout' nella connessione non sono 
frequenti, ma solamente in coincidenza con l'avvio di query 
particolarmente lente, basta rendere piu' sprintose le query 
ottimizzandole un pochetto oppure avvertire l'operatore
A mio avviso pure uno zoom sui report sarebbe il benvenuto
Maaah.. sembra sempre di essere l'ultima ruota del carro
 

 Maaah.. sembra sempre di essere l'ultima ruota del carro
 
Sì, in effetti più volte mamma MS ha tentato di scaricare Access, salvo rendersi conto ogni volta che è un prodotto che funziona.
Ora con tutti i servizi in abbonamento che vendono, secondo me lo vedono quasi come un concorrente, e per questo non svilupperanno mai una vera interfaccia web, come avevano iniziato a fare quasi vent'anni orsono, e sempre per questo hanno abbandonato gli adp.
Access con una gestione ottimizzata delle tabelle SQL e una vera interfaccia web diventerebbe un mostro contro cui schiantarsi quando si propongono servizi on line a pagamento.
 
Ciao