Newsgroup: it.comp.lang.c
Titolo: Fare il log dei messaggi provenienti da un indirizzo internet (con numero di porta)

Ciao.
Sono alla ricerca di informazioni per risolvere  il seguente problema:
 
Ho un programma scritto in c che effettua delle misure e gestisce due strumenti.
Il medesimo programma dovrebbe anche (in un preciso istante) aprire una connessione verso un indirizzo internet del tipo xxx.yyy.zzz.www porta abcd
ed iniziare a registrare su di un file di log tutto quello che arriva dal su indicato indirizzo e poi, in un altro ben preciso istante, chiudere la connessione ed il file di log.
Detto file di log però dovrebbe essere creato in modo da far proseguire il programma a continuare a fare le sue mansioni di misure e gestione degli strumenti.
 
Per questa ultima parte credo che bisogni far ricorso a processi padre e figlio (se mi sbaglio ditemelo) ma la parte più ostica è come riuscire a registrare i messaggi in modo automatico.
Ho provato a fare qualcosa con i socket ma ottengo risposta solo se interrogo la porta o si può fare altrimenti?
 
Grazie infinite per qualsiasi suggerimento.

 Ho provato a fare qualcosa con i socket ma ottengo risposta solo se interrogo la porta o si puň fare altrimenti?
Non si capisce cosa vuoi fare.
Cosa significa "in modo automatico?" se e' necessario farlo su host
remoto, per forza di cose occorrera' che sull' host remoto sia attivo
un server sempre in ascolto con il compito di loggare i dati che riceve: 
la tua applicazione dovra'implementare il client per connettersi al 
server e inviare i dati da logggare.
AA.
 
 

 AA.
 
Immagina un apparato con un suo indirizzo di rete ed una specifica porta che con continuita' invia misure ti temperature, potenza ricevuta, potenza emessa, etc. su lan. Aggiungo anche che i messaggi arrivano anche molto velocemente, magari ogni centesimo di secondo (in ogni caso non in modo periodico tanto che il messagio ha data ed ora). Il protocollo piu' che TCP e' UDP, (infatti non c'e' il tempo materiale per controllare se il pacchetto e' arrivato e richiederne la trasmissione). Aperto il file di log quindi il programma dovrebbe essere in ascolto ed ogni messaggio ricevuto dovrebbe scriverlo su file.
Probabilmete devo agire via socket solo che non devo usare il tcp ma l'udp.
 
Quando dico che deve procedere in modo automatico il senso e' come se si trattasse di due programmi separati (di fatti adesso faccio proprio cosi') uno che fa le misure (il programma scritto da me) e l'altro che effettua il log su file. Questo applicativo che uso e' fornito dalla manifatturiera che realizza l'apparato ma e' inpensabile che io abbia automatizzato tutta la misura ma debba in ogni caso seguirla per far partire e fermare il log su file sequenziali, pigiando con il mouse un push button start ed un altro stop.
 
Alla fine di tutto, si tratta di correlare i dati misurati dal programma C con i dati salvati sul log. Grazie al fatto che sul log sono registrati gli istenti della varie registrazioni, posso ottenere altre informazioni oltre a quelle che gia' attualmente estraggo.
 
Spero di essere stato piu' chiaro.
In ogni caso grazie per la risposta.

 
 
[...]
 
Stai ragionando su "come" vuoi fare qualcosa, non su "cosa" devi fare.
 
Prima di tutto: hai provato prima di tutto a risolvere la cosa a livello di
sistema? Magari ti basta scrivere su un file normalissimo ma su un disco di
rete (mountpoint NFS, attraverso un tunnel, in VPN, etc.etc.). O magari ti
basta fare dei sync ogni tot secondi/minuti (in rsync, scp, etc.).
Se, per qualche motivo, questa non fosse una strada viabile, magari dall'altro
lato hai un interfaccia http, e ti basterebbe chiamare in shell wget o simili
per fare semplici richieste get con i messaggi di log.
 
In ogni caso, hai così tante ottime possibilità da vagliare che mi pare strano
tu sia nella situazione di dover reinventare la ruota..
 
Ciao!

 
 
Cosa intendi?
Ovvio che per ricevere dati da un server, devi collegarti a questo server 
tramite socket e poi interagire tramite il protocollo implementato dal 
server.
 
 
Ciao  Manlio

 linux (o cygwin come nel mio caso), quindi grazie del suggerimento.
Posix  :-)
 
 > Aggiungo anche che i messaggi arrivano anche molto velocemente, 
magari ogni
 > centesimo di secondo (in ogni caso non in modo periodico.....

Riassumo:
- Hai un apparato che esegue delle misure ed deve inviare i dati
   in rete.
- La velocita' di trasmissione dati e' di circa 100ms/pacchetto,
   quindi piuttosto bassa :-)
   Il problema qui non e' tanto la velocita' di trasmissione ma la
   quantita' di dati per pacchetto (Ricordo che 1 trama circa 1.4K)
- Un altro apparato riceve i dati e li traccia quando richiesto
   dall' operatore (START/STOP), oppure lo deve fare in modo
   automatico su un trigger contenuto nei dati o in ogni modo ?
 
Ci sono varie soluzioni: il tuo apparato deve trasmettere dati a uno
specifico server e questo server deve essere vivo, allora una
connessione TCP/IP dovrebbe risolvere il problema (il tempo indicato
non e' cosi' critico(*)):
il tuo applicativo apre una connessione con il server e invia i dati.
Se il server non e' disponbile, eventualmente ritentera' la connessione
dopo un tempo x.
 
(*) E' il protocollo TCP/IP che gestisce l' ACK e gli eventuali retry
     non e' che devi farlo a mano!
 
Se invece l'apparato deve trasmettere in rete i dati senza curarsi di
chi e' in ascolto, allora dei pacchetti UDP in broadcast sono quello che 
serve, tenendo presente che la dimensione massima del pacchetto in 
broadcast e' system-dependend e puo' essere abbastanza piccolo
(1 trama) mentre se l' UDP e' indirizzato ad una specifica stazione il 
size e' di circa 64K (ma in questo caso deve esistere il server!)
AA.
 
 
 
 
 

 
La questione e' proprio questa.
Una misura dovrebbe essere piu' o meno cosi':
 - Start programma
 - Configurazione GPIB
 - Configurazione dei due strumenti
<a>
 - Prima misura da strumento
<b>
 - Modifica configurazione di uno strumento
<c>
 - Seconda misura
<d>
 - Fine processo
 
Attualmente nel punto <a> usando l'applicatifo fornito dalla manifatturiera, clicco su start log
arrivato al punto <c> clicco su stop log
e cosi' viene creato un file di log il cui nome e' del tipo SYSLOG145.log
al punto <c> riclicco start log e viene creato il SYSLOG146.log ed inizia a registrare arrivato al punto <d> clicco stop log e viene chiuso SYSLOG146.log.
 
Io vorrei evitare di dover stare a guardare la misura per fare click e riclick
anche perche' non hai idea delle volte in cui mi distraggo o non sono preciso nello start e stop etc.
Inoltredevo segnarmi i numeri relativi ai log altrimenti non so piu'  a cosa si riferiscono.
 
Gradirei che il tutto fosse automatico e consistente.
 


Rispondendo sotto ho spiegato (piu' o meno) come dovrebbe funzionare la misura.
Giusto per darti un'idea delle tempistiche riporto l'inizio di alcuni messaggi:
000007 09.03 15:32:07.456 
000008 09.03 15:32:07.456
000009 09.03 15:32:07.456 
000010 09.03 15:32:07.456
000011 09.03 15:32:07.597
000012 09.03 15:32:07.597
000013 09.03 15:32:07.941
000014 09.03 15:32:07.941
000015 09.03 15:32:08.379
000016 09.03 15:32:08.394
ed ognuno di questi e' lungo mediamente 600, 700 caratteri.
Ogni trance (tra <a> e <b> o tra <c> e <d>) contempla mediamente 60000 messaggi

 [...]
 
Ed in tutto questo, cosa centra la questione del server esterno a cui 
devi collegarti via socket?
L'applicativo offre una interfaccia accessibile via socket?
 
 
Ciao  Manlio

 Ciao  Manlio

la connessione ed il file di log.<snip>
 
Ciao, per queste cose hanno inventato il protocollo syslog: anche se
non ho mai dovuto occuparmene, sono sicuro che troverai librerie
pronte all'uso da qualche parte. 
Prova a vedere se e' quello che fa per te, adattandolo al tuo caso  :)
-- 
andrea - ri mi cci, name

 andrea - ri mi cci, name
 
Sembra interessante ma....
...mi potresti indirizzare.......

...mi potresti indirizzare.......
 
Non posso, so solo che esiste, ma con un po' di google sono sicuro che
qualcosa trovi.
