Scambio messaggi tra processi

Sul QL c’è la possibilità di poter scambiare messaggi tra processi differenti esattamente come avviene tra un server e un client. Anche qui ovviamente si usa la stessa terminologia: un processo “server” fornisce informazioni restando in ascolto mentre un processo “client” si collega per ricevere informazioni. Sempre con lo stesso principio (ovvero la similitudine con una rete) è possibile inviare e ricevere o filtrare messaggi “broadcast” inviati in contemporanea a più processi. Ovviamente, in questo caso non è necessario manipolare lo stack tcp/ip: si programma solo ad alto livello. Per fare ciò è necessario utilizzare le funzionalità di CSM (acronimo di Client Server Manager): giunto alla sua versione 1.22 e rilasciato nel 1996 permette lo scambio di messaggi / informazioni ecc. tra processi superando la limitazione di comunicazione che di default sono 1:1. Qui è possibile mandare messaggi a più processi in contemporanea senza la necessità di aprire in continuazione delle “pipe” (canali). Un esempio tipico può essere un database in cui c’è una tabella (server) e l’inserimento dati, modifica e query, da una maschera, vengono eseguite lato client inviando le richieste al server. Di seguito vengono elencati i nuovi comandi utilizzabili all’interno del Basic.

CLIENT ‘nome'[,buffer]
Per l’oggetto “nome” viene associato il ruolo di client. Il buffer di default è 512 bytes. Se specificato deve essere 32 byte più grande della più grande pacchetto di risposta da parte del server.

LISTENER ‘nome'[,buffer]
Per l’oggetto “nome” viene associato il ruolo di listener che è un super-set del ruolo di client. In questo caso il client puo’ ricevere, tramite un meccanismo di interrogazioni (polling) dei messaggi di norma non desiderati di broadcast dal server.

REQUEST ‘nome’,’comando'[,res$]
Si tratta di un comando client di richiesta al server per l’oggetto “nome” con il comando specificato e restituisce il risultato nella variabile res$.
Se non viene passato il parametro “res$”, il server non restituirà alcun risultato

res = LSTNPOLL (‘nome’, bro$, [,timeout])
comando listener. Vengono fatte delle interrogazioni (polling) per un messaggio broadcast dal server “nome”. Può essere specificato un parametro di timeout in cicli di clock (1/50, 1/60 di secondo) altrimenti rimane in attesa per una richiesta. Il risultato è restituito alla variabile res ed ha un valore negativo in caso d’errore. Il processo listener considera questa variabile in sola lettura. Bro$ è il messaggio broadcast

context = SRVPOLL (‘nome’,req$ [,timeout])
Comando server. Vengono fatte delle interrogazioni (polling) per le richieste (req$) di un oggetto “nome”. La variabile assumerà un valore negativo in caso di errore.
Se la variabile context assume il valore 0 significa che il client ha effettuato una richiesta di 2 parametri. Questa variabile è considerata dal server di sola lettura.

SRVREPLY context,res$
manda una risposta alla richiesta dal client identificato dal variabile contestuale “context”. Un server deve rispondere a tutte le richieste quando il valore contesto è positivo, una stringa vuota ” ” è una risposta valida

SRVRBRO ‘name’,bro$
comando server. Lancia un messaggio broadcasts ‘bro$’ a tutti i LISTENERS

FREECLIENT ‘name’ / FREELSTN ‘name’
Termina una sessione client o listener di nome “name” (NB: in un programma compilato non è necessario ma è obbligatorio in un programma non binario passato tramite l’interprete)

FREESERVER ‘name’
Termina una sessione server di nome “name”

i% = FINDSERVER (‘name’)
controlla la presenza del server “name”. La variabile assumerà il valore 0 se non verrà trovato, 1 se l’ha trovato, error in caso di errore.

i% = SRVPEND(‘name’)
Controlla se è presente una sequenza di richieste polling fatte da SRVPOLL. La variabile avrà valore 0 se non ci sono dati, 1 se ci sono dati o error in caso di errore.

Esempio di programmazione:

     IF FINDSERVER('QFAX') = 1 THEN
      CLIENT 'QFAX'
      REQUEST 'QFAX','SUSPEND'
      REMark set QTPI exitparam to resume it
      FREECLIENT 'QFAX'
     ELSE
      IF FINDSERVER('SMON') = 1 THEN
       REMark SMBOX
       etc