Autore Topic: [RISOLTO ...quasi] implementare telnet in gambas  (Letto 2267 volte)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
[RISOLTO ...quasi] implementare telnet in gambas
« il: 15 Ottobre 2013, 18:37:46 »
Benché all'inizio avessi pensato che implementare un telnet in gambas sarebbe stato una passeggiata, devo confessare che sto incontrando delle difficoltà.
Sembra che il server che devo interrogare (che risponde benissimo con il telnet di ubuntu-bash, non gradisca ricevere comandi da applicazioni gambas.
Ho provato anche il programmino tcpsocket client degli esempi e nulla da fare.
Nessuna risposta.
Da notare che il server accetta la connessione dall'esempio gambas e resrituisce la stringa d'ok "201 ok", ma poi non prende piu comandi e non restituisce alcunché.
Da telnet via bash invece tutto fila liscio.
Che voi sappiate sono segnalati bug sul socket tcp?
« Ultima modifica: 17 Ottobre 2013, 11:42:58 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: implementare telnet in gambas
« Risposta #1 il: 15 Ottobre 2013, 20:16:52 »
Hai per caso visto questo semplice esempio ?

http://www.gambas-it.org/smf/index.php?topic=2709.0|
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: implementare telnet in gambas
« Risposta #2 il: 15 Ottobre 2013, 22:01:51 »
Domani mattina ci riprovo
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: implementare telnet in gambas
« Risposta #3 il: 17 Ottobre 2013, 11:38:04 »
ALLELUJA ALLELUJA!!!!!

per la serie "sono un pollo" ...... il server telnet aspetta un Carriage Return per passare all'interprestazione dei comandi .....

quindi e' bastato aggiungere al comando inviato al telent (nel mio caso per esempio "uls") il carattere CR ovvero chr(10) ... poi inviarlo

Codice: [Seleziona]
Public Function MLTCommand(comando As String) As Boolean
  hTim = New Timer As "Timer1"
  hTim.Delay = 10000  '10 secondi di timeout
  hTim.Enabled = True  'poi aspetto per il time out

  If TcpConnection.Status = Net.Connected Then
    Comando = comando [b]& Chr(10)[/b]
    Write #TcpConnection, Comando, Len(Comando)
  End If
  Print "comando: " & Comando

  hTim.Enabled = True  'poi aspetto per il time out per la risposta dal server
  Do
    Wait
  Loop Until (Risposta <> "") Or (hTim.Enabled = False)
  
  If hTim.Enabled = False Then
   Return False
  End If
  
  Print Risposta
  hTim.Stop
End


ora il probelma e' che la procedura:
Codice: [Seleziona]
Public Sub TcpConnection_read()
 
  '****************************************
  ' When some data arrives from the remote
  ' part of the socket, "DataAvailable" event
  ' is raised
  '****************************************

  If TcpConnection.Status = Net.Connected Then
    Read #TcpConnection, Risposta, Lof(TcpConnection)
    Print Risposta
  End If
 
End

mi ritorna una sola stringa, ma l'output del server puo' essere una serie di righe in serie.

Ovvero, questo e' quello che restituisce il server utilizzandolo via telnet/bash:
Citazione
201 OK
U0 00 sdl_preview:384x288 1

e questo e' quello che restituisce la procedura di lettura sopra indicata:
Citazione
201 OK
« Ultima modifica: 17 Ottobre 2013, 12:24:08 da allegfede »
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #4 il: 17 Ottobre 2013, 12:57:54 »
ho anche provato cosi':

Codice: [Seleziona]
Public Sub TcpConnection_read()

  '****************************************
  ' When some data arrives from the remote
  ' part of the socket, "DataAvailable" event
  ' is raised
  '****************************************
 
  If TcpConnection.Status = Net.Connected Then
      While Not Eof(TcpConnection)
        Read #TcpConnection, Risposta, Lof(TcpConnection)
        Print Risposta
      Wend
  Endif
 
End

ma sempre con scaris risultati ....
Citazione
201 OK
se corri, morirai stanco (motto degli sniper)

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 265
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #5 il: 17 Ottobre 2013, 17:50:29 »
ho anche provato cosi':

Ai tempi dei tempi (parlo dei primi '90) era prassi comune nei server telnet usare dei caratteri aggiuntivi nei comandi, se (e ripeto se) non ricordo male il comando era composto tipo da un carattere, un backspace, e ancora un carattere. Dei tre caratteri sono sicuro, di quale nel mezzo no, se vengono ancora usate questi sistemi nemmeno (allora era comune, io per esempio lo usavo su mclink), e ora come ora nemmeno ricordo lo scopo.
Nel caso il problema sarebbe che gli stai inviando un comando incompleto... se poi il server e' tuo, allora non c'entra niente!

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #6 il: 17 Ottobre 2013, 18:25:36 »
no il comando lo prende bene (... penso ...) perche' mi risponde in modo corretto .... ma e' come se l'evento di lettura fosse generato TROPPO presto (intercettando solo la prima riga delle 3 o piu') oppure l'evento ritorna tutto ma io leggo solo la prima riga ....

la storia dei caratteri e' plausibile ..... ma non so come intercettare lo "stream" nudo e crudo per fare eventualment un'analisi
se corri, morirai stanco (motto degli sniper)

Offline pastrank

  • Maestro Gambero
  • ****
  • Post: 265
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #7 il: 17 Ottobre 2013, 21:06:19 »
e' come se l'evento di lettura fosse generato TROPPO presto (intercettando solo la prima riga delle 3 o piu') oppure l'evento ritorna tutto ma io leggo solo la prima riga ....

Una pausa di un paio di secondi messa da te prima della lettura? Oppure, proprio non aspettarlo il codice di ritorno?

la storia dei caratteri e' plausibile ..... ma non so come intercettare lo "stream" nudo e crudo per fare eventualment un'analisi

Quelli erano da mettere quando si mandavano i comandi, non quando si ricevevano.

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #8 il: 18 Ottobre 2013, 01:44:18 »
ho anche provato cosi':

Chissà se provi con:
Codice: gambas [Seleziona]

   While True
     ....
     ....
   Wend

Ponendo True, la condizione risulta sempre vera, generando virtualmente un ciclo infinito. Dal ciclo si uscirà soltanto quando non c'è più niente da leggere.
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #9 il: 18 Ottobre 2013, 12:16:21 »
buona idea ....
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #10 il: 21 Ottobre 2013, 19:56:43 »
allora ..... riassunto puntate precedenti .....

il server telnet che IO devo interrogare risponde per RIGHE (e piu' di una ... necessariamente ...)

quindi la procedura di tcp_read NON risponde una stringa con TUTTO il contenuto della risposta dal server (magari separando le righe con CR o LF), ma solo PIU' VOLTE le singole righe che il server ritorna.

A fronte di cio' non posso aspettare che l'evento read ritorni qualcosa o vada in time-out per sancire il successo o meno dell'operazione, ma devo fare (COME SUGGERITO) un ciclo di attesa che controlli se la "risposta" non stia piu' cambiando pe un tot di tempo per ipotizzare che la comunicazione sia avvenuta con successo .....

vi terro' informati :D
se corri, morirai stanco (motto degli sniper)

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #11 il: 23 Ottobre 2013, 19:14:40 »
altro test .....
dopo aver definito cosi':
Codice: [Seleziona]
Private hTim As Timer 'timer per il timeout

Public Risposta As String   'e' la stringa che contiene la stringa di ritorno dal server MLT
Public Ritorno As New String[]   'e' il vettore di stringhe che immagazzinanao le righe ritornate dal server telent MLT
Public indice As Integer

chiamo cosi':
Codice: [Seleziona]
 SendCommand("list u0")  'chiede al server cosa contiene la lista media dell'unita' u0
  hTim.Delay = 2000 'aspetto un po' meno dei soliti 10 secondi (ora 2 sec)
  hTim.Enabled = True  'aspetto per il time out per la risposta dal server
  Do
    Wait
  Loop Until hTim.Enabled = False
 
  Print Ritorno.Count
  If (Ritorno(0) Like "*201 OK*") = True Then
    'significa che il server ha riconosciuto il comando e mi ha ritornato la lista dei parametri nel vettore
    hTim.Stop
    For j = 0 To Ritorno.Count - 1
      Print Ritorno(j)  'stampa le righe
    Next
    Else
      'ho solo il time out e c'e' un problema
      Print "NON riesco ad ottenere la lista dei media (TIME OUT)!" & gb.CrLf & Risposta & gb.crlf & "Contattare l'amministratore !!!!"
      'send email to admin
      Quit
  Endif

questo e' il "comando"
Codice: [Seleziona]
Public Sub SendCommand(comando As String)
  risposta = ""  'cancella la stringa di ritorno dalla lettura telnet
  Ritorno.Clear 'cancella il vettore
  indice = 0     'indice del vettore delle righe restituite dal server
 
  If TcpConnection.Status = Net.Connected Then
    Comando = comando & Chr(10)
    Write #TcpConnection, Comando, Len(Comando)
  End If
 
End

e questo il read dal socket:
Codice: [Seleziona]
Public Sub TcpConnection_read()

  '****************************************
  ' When some data arrives from the remote
  ' part of the socket, "DataAvailable" event
  ' is raised
  '****************************************

  If TcpConnection.Status = Net.Connected Then
    Read #TcpConnection, Risposta, Lof(TcpConnection)
    Ritorno.Add(risposta)
  End If
 
End

effettivamente l'array si riempie con 2 oggetti ma non riesco ad accedere al singolo elemento:
Citazione
OTVA deamon for channel: Tele Galileo   
DB_server: 192.168.1.91:3306
DB_account: OTVA_user:OTVA_password
refresh frequency: 30 minutes
Melted server: localhost:5250

select * from MediaPlaylist where channel = 'Tele Galileo' and data = '10/23/2013' order by start_time
ci sono 0 media in lista
select * from SpotPlaylist where channel = 'Tele Galileo' and date = '10/23/2013' order by time
ci sono 0 spot in lista
tentativo di connessione ...
connessione al server melted RIUSCITA!
CONNESSO
2
MMain.GetMeltedServerStatus.278: #9: Not a function
1: MMain.GetMeltedServerStatus.278
2: MMain.Main.141

.... penso che l'errore sia qui' :
Codice: [Seleziona]
If (Ritorno(0) Like "*201 OK*") = True Then 

ma non so cosa intenda :-(
se corri, morirai stanco (motto degli sniper)

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.266
  • Ne mors quidem nos iunget
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #12 il: 28 Agosto 2015, 00:33:45 »
.... penso che l'errore sia qui' :
Codice: [Seleziona]
If (Ritorno(0) Like "*201 OK*") = True Then 

ma non so cosa intenda :-(
Essendo "Ritorno" un vettore di tipo String[] e non una funzione, quella riga andrebbe scritta così:
Codice: gambas [Seleziona]
If (Ritorno[0] Like "*201 OK*") = True Then

la quale significherà: se la stringa, presente nel primo elemento della variabile vettoriale "Ritorno", contiene la riga "201 OK", allora......
« Chiunque, non ricorrendo lo stato di necessità, nel proprio progetto Gambas fa uso delle istruzioni Shell o Exec, è punito con la sanzione pecuniaria da euro 20,00 a euro 60,00. »

Offline allegfede

  • Gran Maestro dei Gamberi
  • *****
  • Post: 738
    • Mostra profilo
Re: [RISOLTO ...quasi] implementare telnet in gambas
« Risposta #13 il: 28 Agosto 2015, 17:14:31 »
vero .... controllo

..... non ritrovo il codice :D e sembra che nell'implementazione finale della mia app abbia optato per il polling (lo so che non e' elegante, ma sapete come sono fatto) :D
« Ultima modifica: 28 Agosto 2015, 17:18:44 da allegfede »
se corri, morirai stanco (motto degli sniper)