[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

Re: Socket in perl.



In data mercoledì 23 settembre 2009 09:17:23, hai scritto:
> > secondo voi esiste un modo per fare una sorta di controllo della
> > comunicazione della porta per vedere se effettivamente i comandi
> > vengono spediti o meno?
> 
> wireshark e vedi tutto quello che entra e esce.

ecco il punto della situazione, sono riuscito a mandare i comandi alla 
macchina, che li esegue correttamente (lo verifico visivamente), l'errore 
stava nel fatto che la macchina si aspetta anche un codice di checksum (la 
semplice somma dei due comandi in questo caso).

> 
> Io non sono un esperto di perl, ma posso dirti che in udp non ha molto
> senso spedire e ricevere arbitrariamente un pacchetto (il pacchetto di
> risposta puo' arrivare prima della tua recv e non viene bufferizato).
> Per fare una cosa simile io ho usato un thread di ricezione (ho gia'
> adattato alla bene in meglio a quello che devi fare tu):
> 

ti ringrazio tantissimo dell'aiuto e delle info... purtroppo ancora la parte 
del ritorno non funziona.

con questo comando la macchina mi dovrebbe tornare (entro 10ms) una risposta 
(e lo fa, vedo il led del receive della moxa che si illumina, quindi un 
transito di dati c'é dal device all'interfaccia).

Non ho ben capito il tuo codice, penso di aver capito che si tratta di un 
thread che gira in parallelo ed aspetta i dati dalla stessa socket su cui 
l'ho spedito (e presumo che non possa essere diversamente, non credo che si 
possa stabilire una socket diversa per la ricezione), quindi mettendosi in 
ascolto prima che venga mandato il comando, dovrei riuscire ad intercettare 
la risposta.

ora le risposte possono essere diversi, in questo caso si tratta di leggere 
3 byte, 0x10 0x01 0x11 (l'ultimo è il checksum) nel caso di esito positivo e 
4 byte nel caso di esito negativo 0x11 0x12 più un byte che varia in 
funzione dell'errore e naturalmente il checksum.

io vorrei modificare il programma in modo che se ottengo l'ack (l'esito 
positivo) esco dal programma semplicemente.

nel caso invece venga ricevuto il nak (not ack) venga riprovato l'invio, per 
un massimo di 3 tentativi, poi si smette semplicemente.


in questo momento, lanciando il programma il comando viene eseguito, ma lo 
script mi ritorna questo errore:

:~# ./play.pl
Thread 1 terminated abnormally: Can't locate object method "can_read" via 
package "IO::Socket::INET" at ./play.pl line 42.
Timeout end!
:~#


la linea 42 sarebbe la linea del foreach nel pezzo di codice che mi hai 
inviato...

questo pezzo di codice è la parte più ostica, anche se ne ho capito il 
concetto, mi sfuggono alcune cose (non conosco perl, come ho già detto).

(mentre scrivo mi sto leggendo un po' di cose da cpan e qualcosa mi si è 
chiarito).

sub _service_recv {
        my $s = shift;
        print "service_recv started\n" if ($debug);

        while($running) {
                foreach my $r ($s->can_read(1)){
                        $r->recv($response, 2);
                        print "ritorno: ", $response, "\n";
                }
        }
        print "service_recv shutting down\n" if ($debug);
}


poi il join non dovrebbe essere prima dei send? altrimenti mi pare di capire 
che non viene lanciato il thread prima dei send, e potrebbe essere il motivo 
per cui comunque non riesco a trovare dei valori di ritorno...


poi... visto che non conosco a priori il numero di byte che devo leggere 
(minimo 3 massimo 4, in questo caso), che succede se mi metto in attesa di 
un numero di byte superiore a quelli spediti?

Tnx&Byez
-- 
Gollum1
Tessssoro, dov'é il mio Tessssoro? 
--------------------------------------------------------

Questa e-mail, ed i suoi eventuali allegati, contengono informazioni confidenziali e riservate. 
Se avete ricevuto questa comunicazione per errore non  utilizzatene il contenuto e non portatelo a conoscenza di alcuno. Siete inoltre pregati di eliminarla dalla vostra casella e avvisare il mittente. 
E' da rilevare inoltre che l'attuale infrastruttura tecnologica non puo' garantire l'autenticita' del mittente, ne' tantomeno l'integrita' dei contenuti. 
Opinioni, conclusioni ed altre informazioni contenute nel messaggio possono rappresentare punti di vista personali a meno di diversa esplicita indicazione autorizzata.
--------------------------------------------------------


Reply to: