Salve a tutti.
Ho una applicazione che codifica dei dati (audio) e li invia ad un altro pc su una specifica porta (la 9000 per esempio).
Sull'altro PC un'altra applicazione prende i dati e li gestisce in un certo modo.
Non posso mettere mano alla seconda applicazione, ma posso intercettare i pacchetti cosi':
sudo tcpdump -i any -v -n dst port 9000
Pero' ho solo delle informazioni di massima, volendo analizzare il CONTENUTO dei pacchetti dovrei fare una cosa cosi':
sudo tcpdump -i any -v -n dst port 9000 -w capture.cap
che pero' a lungo andare mi crea un file gigantesco.
Secondo voi posso fare un file FIFO e con una applicazione Gambas andare ad analizzare questo file?
Oppure esiste la possibilita' di gestire lo sniffing della rete direttamente dai componenti gambas?
potrei anche fare cosi':
'dati DENTRO il pacchetto in partenza verso la porta 9000:
sudo tcpdump -i any -x -s 0 'dst port 9000'
'oppure per quelli in arrivo alla porta 9000:
sudo tcpdump -i any -x -s 0 'src port 9000'
in soldoni, ho l'encoder su una macchina remota (codifica dati aac) e li incapsula in pacchetti TCP formattati ZMQ (http://zeromq.org/)
su un'altra macchina, questi vengono ricevuti (sono 10 - 15 flussi, sulle porte 9000 - 9015) ed accorpati (multiplexer).
Ora vorrei poter analizzare i pacchetti (se non ne arrivano genero un allarme) ed i dati nei pacchetti (per poter vedere un eventuale segnale in arrivo, ma senza modulazione, nel caso altro allarme).
.... quindi vorrei avere un loop che prende il pacchetto per la data porta, ne estrae il contenuto ed analizza il volume, lo butta e cosi' via ....
inoltre da quello che mi dice lo sviluppatore del multiplexer, i dati nei pacchetti sono organizzati cosi':
struct zmq_frame_header_t
{
uint16_t version; // we support version=1 now
uint16_t encoder; // see ZMQ_ENCODER_XYZ
/* length of the 'data' field */
uint32_t datasize;
/* Audio level, peak, linear PCM */
int16_t audiolevel_left;
int16_t audiolevel_right;
/* Data follows this header */
} __attribute__ ((packed));
quindi l'header di ogni pacchetto zmq e' composto da_
intero unsigned a 16 bit = versione
intero unsigned a 16 bit = nome encoder
intero unsigned a 32 bit = dati veri e propri (audio codificato suppongo)
intero a 16 bit = volume sinistro
intero a 16 bit = volume destro
dando un'occhiata a questa pagina, ho avuto degli spunti interessanti ed effettivamente ci potremmo anceh essere:
http://captainbodgit.blogspot.it/2016/08/using-sockets-with-gambas.html
Vi allego il codice di una piccola applicazione di controllo:
' Gambas class file
Public Sub Button_StartSocket_Click()
ServerSocket1.Listen(1)
If ServerSocket1.Status = Net.Active Then
Button_StartSocket.Enabled = False
Button_Stop.Enabled = True
Debug "Listening on Port: " & ServerSocket1.Port
'ed ora faccio partire il timer dell'allarme
Timer_alarm.Enabled = True
End If
End
Public Sub Button_Stop_Click()
ServerSocket1.Close
Timer_alarm.Enabled = False
Button_Stop.Enabled = False
Button_StartSocket.Enabled = True
End
Public Sub Form_Open()
ServerSocket1.Port = "9000"
End
Public Sub ServerSocket1_Connection(RemoteHostIP As String)
Debug "connected to " & RemoteHostIP
'e resetto il timer perche' ho ricevuto qualcosa
Timer_alarm.Restart
End
Public Sub ServerSocket1_Error()
Debug ServerSocket1.Error
End
Public Sub Timer_alarm_Timer()
Debug "allarme"
End
il dubbio e' se una volta "ascoltati" dalla mia applicazione, gli stessi dati siano acnora disponibili al programma GIUSTO (ovvero il multiplexer che dovrebbe accorparli) ....
PS: Per la cronaca .... mi da allarme se non lancio l'encoder, mi dice "connesso" se lancio l'encoder ... ma ora COME LEGGO I DATI in ingresso che lui "ascolta"?