Newsgroup: it.comp.programmare.win32
Titolo: I/O col modem

Salve a tutti!
Ho programmato una DLL in linguaggio C che richiamo da un programma
in Visual Basic.
La DLL in questione usa le TAPI 2.x per eseguire una chiamata tramite
modem e stabilire una connessione con un altro computer.
Le operazioni di I/O col modem avvengono in 'overlapped mode' per motivi
di efficienza del sistema.
Il monitoraggio della porta del modem avviene con la funzione
WaitCommEvent()
dopo aver impostato il controllo degli eventi con la funzione SetCommMask().
La WaitCommEvent() gira in un thread separato in modo da non bloccare
l'esecuzione delle altre parti di programma.
Il problema sorge quando uso la funzione WriteFile() per scrivere i dati;
la WriteFile infatti scrive tutti i byte che le ordino di scrivere mentre la
ReadFile() che ho sulla macchina remota non legge tutto in un colpo solo
ma in due fasi.
Ecco un esempio:
Ho due macchine: la macchina A e la macchina B, entrambe dotate di modem e
connesse alla linea telefonica.
Eseguo la chiamata e stabilisco la connessione, tutto funziona
perfettamente.
Dalla macchina A invio un pacchetto di 512 bytes usando la WriteFile(), la
funzione
(sebbene programmata in 'overlapped mode') viene eseguita al primo colpo.
Sulla macchina B viene notificato l'evento EV_RXCHAR, richiamo la
ClearCommError()
per vedere quanti bytes giacciono nel buffer di input del modem e scopro che
sono
solo 8. Chiamo la ReadFile() e li leggo tutti e 8, immediatamente dopo
(senza che
dalla macchina A sia stata lanciata una qualche funzione) arriva un'altra
notifica
relativa all'evento EV_RXCHAR, richiamo di nuovo la funzione
ClearCommError() e
mi accorgo che nel buffer di input del modem ci sono i rimanenti 504 bytes
che
mancavano all'appello la prima volta.
Non sembrerebbe essere un grave problema ma in realtà lo è perche l'invio di
pacchetti è per me fondamentale, infatti devo inviare pacchetti di 512 byte
in
rapidissima successione, perciò ho bisogno di riceverli esattamente come li
ho
spediti altrimenti si attaccano tra loro e non riesco più a distinguerli.
Perciò come faccio a leggere con la ReadFile() in una sola volta tutto il
pacchetto
che la WriteFile() ha inviato?
Grazie a tutti
Francesco

 Saluti.
Ciao Fabio,
dunque credo che quello che voglio ottenere io proprio non si possa fare.
Infatti ho 'postato' il mio messaggio anche su altri newsgroup
(microsoft.public.win32.programmer.network e
microsoft.public.win32.programmer.tapi) (una sorta di multithreading
applicato ai messaggi :-) e tutti, bene o male, mi hanno detto che la cosa
non si può fare.
Credo, da quel poco che ne capisco, che la spiegazione stia nel fatto che le
risorse sono condivise e che alla fin fine è Windows che decide come usare
le periferiche al livello più basso.
Penso che per me l'unica soluzione sia quella di riscrivere il codice del
mio programma che gestisce il flusso di byte in entrata in modo tale da
fargli ricomporre i pacchetti man mano che i byte arrivano.
Ho pensato, per il pacchetto, di usare un piccolo header (di lunghezza
fissa) che sia in grado di istruire da subito il programma ricevente sui
byte che stanno arrivando in rapida successione. Questo dovrebbe permettermi
di inviare anche pacchetti di lunghezza variabile rendendo il programma più
flessibile.
Grazie per il tuo aiuto
Francesco


Ecco, questo è il punto in cui mi sono spiegato male (anzi a tratti non mi
sono spiegato affatto...).
Durante lo sviluppo mi sono reso conto che l'invio di pacchetti di lunghezza
fissa a 512 byte rendeva il mio programma troppo rigido, infatti per ogni
pacchetto di 512 byte inviato dalla macchina A mi aspetto, in risposta, un
piccolo messaggio che notifichi la sua corretta ricezione da parte della
macchina B, in questo caso inviare una notifica di 512 byte sarebbe
dispendioso. Col metodo dell'header a lunghezza fissa (che sia in grado di
descrivere pacchetti di lunghezza variabile) mi posso permette anche di
inviare pacchetti molto più piccoli (10 o 12 byte per esempio) usando la
banda a mia disposizione in maniera più efficiente.
Sicuramente il metodo da te descritto funziona e, se il programma lo
richiederà, lo implementerò.
Ti ringrazio ancora per la tua disponibilità, sei stato gentilissimo.
Alla prossima
Francesco Salice