Autore Topic: Ping a altra macchina nella rete lan locale con Gambas  (Letto 952 volte)

Offline Praino

  • Gamberetto
  • *
  • Post: 24
    • Mostra profilo
Ping a altra macchina nella rete lan locale con Gambas
« il: 16 Settembre 2020, 18:23:50 »
Ciao a tutti..
Sono nuovissimo, anzi inizio da qui.... :)
Uso e studio Linux mint da diverso tempo e mi trovo molto bene.
Sono anche un po programmare e con progettini semplici mi sono fin'ora dilettato con il VB5 e 6 su Windows.
Ora su Linux ho scoperto "Gambas" e allora vorrei provare a creare qualcosa anche nel mondo del Pinguino.
Su VB avevo fatto alcuni "esperimenti" simulando il comando "Ping" per capire se una macchina sulla Lan
era attiva o no. Come è possibile ottenere lo stesso con Gambas su Linux ?
Grazie


Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #1 il: 16 Settembre 2020, 19:22:30 »
Forse questa lezione di jsbsan può esserti utile:

https://sologambas.blogspot.com/2012/08/haciendo-ping-en-gambas.html

Ciao e benarrivato fra noi  :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #2 il: 16 Settembre 2020, 20:06:11 »
« Ultima modifica: 06 Maggio 2022, 01:14:02 da vuott »
« 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 Praino

  • Gamberetto
  • *
  • Post: 24
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #3 il: 17 Settembre 2020, 07:58:08 »
Grazie ad entrambi :)



Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #4 il: 17 Settembre 2020, 10:40:01 »
Prego  :)

Una cosa che spesso dimentichiamo di citare, anche perché è un vero e proprio caos di programmi fatti più o meno bene (più meno che più) è la Software farm.
Vedo che scrivendo ping nel filtro ottengo qualche risultato, alcuni senz'altro inutili come ping-pong (vedi immagine).
Comunque la farm può essere molto utile, qui una piccola guida all'uso:
https://www.gambas-it.org/smf/index.php?topic=6251.msg43602#msg43602
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #5 il: 17 Settembre 2020, 11:52:08 »
Parlare della Software farm e il fatto che un esempio a volte è più utile di una spiegazione, mi ha fatto venire in mente che l'IDE di Gambas3 è scritto in Gambas dallo stesso Benoit Minisini e quale miglior maestro di chi ha inventato Gambas?

Per vedere il codice sorgente, se abbiamo compilato dai sorgenti basta aprire Gambas e da File > Apri progetto navigare fino alla "cartella di gambas3" > app > src > Gambas3 e usare la IDE come un qualunque progetto di Gambas.

Se non abbiamo compilato Gambas, basta scaricarsi da git il Gambas3 che abbiamo, ad esempio se vogliamo scaricare l'ultima stabile lo faremo da qui:
https://gitlab.com/gambas/gambas

Clicchiamo sulla combo con scritto master e dalla lista scegliamo la stabile spuntando stable oppure se abbiamo una stabile più vecchia possiamo sceglierla scorrendo la lista verso il basso.

Una volta spuntata la versione che ci occorre, agendo sul pulsante tra Find file e Clone possiamo fare il download del file compresso, decomprimerlo e proseguire nell'apertura di Gambas come visto sopra.

Vedi immagini allegate
« Ultima modifica: 17 Settembre 2020, 11:54:37 da Gianluigi »
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline cogier

  • Gambero
  • **
  • Post: 57
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #6 il: 17 Settembre 2020, 17:09:16 »
Prova questo codice.

Codice: [Seleziona]
Public Sub Form_Open()

  Dim sPing As String

  Shell "ping -c 1 192.168.2.85" To sPing

  Print sPing

End

Offline vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #7 il: 17 Settembre 2020, 18:32:17 »
« 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 vuott

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 11.724
  • Ne mors quidem nos iunget
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #8 il: 18 Settembre 2020, 11:42:56 »
Ho trovato un breve codice, scritto in C, ma - lanciando il codice C compilato - sembra non funzionare proprio la parte finale dell'invio del ping.
Che sfortuna !

Ho comunque tradotto in Gambas (un lavoraccio !) la parte iniziale, quella che funziona:

Codice: [Seleziona]
Private Const PORT_NO As Integer = 0


Library "libc:6"

Public Struct sockaddr_in
  sin_ As Short
  sin_port As Short
  sin_addr As Integer
  sin_zero[8] As Byte
End Struct

Public Struct hostent
  h_name As Pointer
  h_aliases As Pointer
  h_addrtype As Integer
  h_length As Integer
  h_addr_list As Pointer
End Struct

Public Struct sockaddr
  sa_ As Short
  sa_data[14] As Byte
End Struct

Private Const IPPROTO_ICMP As Integer = 1
Private Const AF_INET As Integer = 2
Private Const SIGINT As Integer = 2
Private Const SOCK_RAW As Integer = 3
Private Const NI_MAXHOST As Integer = 1025
Private Const NI_NAMEREQD As Integer = 8

' int socket (int __domain, int __type, int __protocol)
' Create a new socket of type TYPE in domain DOMAIN, using protocol PROTOCOL.
Private Extern socket(__domain As Integer, __type As Integer, __protocol As Integer) As Integer

' __sighandler_t signal (int __sig, __sighandler_t __handler)
' Set the handler for the signal SIG to HANDLER.
Private Extern signal(__sig As Integer, __handler As Pointer) As Pointer

' struct hostent *gethostbyname (const char *__name)
' Return entry from host data base for host with NAME.
Private Extern gethostbyname(__name As String) As Hostent

' char *inet_ntoa (struct in_addr __in)
' Convert Internet number in IN to ASCII representation.
Private Extern inet_ntoa(__in As Integer) As Pointer

' in_addr_t inet_addr (const char *__cp)
' Convert Internet host address from numbers-and-dots notation in CP into binary data in network byte order.
Private Extern inet_addr(__cp As Pointer) As Integer

' int getnameinfo (const struct sockaddr *__restrict __sa, socklen_t __salen, char *__restrict __host,
' socklen_t __hostlen, char *__restrict __serv, socklen_t __servlen, int __flags)
' Translate a socket address to a location and service name.
Private Extern getnameinfo(__sa As Sockaddr_in, __salen As Integer, __host As Pointer, __hostlen As Integer, __serv As Pointer, __servlen As Integer, __flags As Integer) As Integer


Public Sub Main()

  Dim sockfd, addrlen As Integer
  Dim indirizzo As String
  Dim ip_addr, intHandler As Pointer
  Dim addr_con As New Sockaddr_in
  Dim rev As Byte[]

     indirizzo = "162.241.217.63"
 
  addrlen = Object.SizeOf(addr_con)
 
  ip_addr = Ricerca_DNS(indirizzo, addr_con)

  If ip_addr == 0 Then
    Print "Ricerca fallita: impossibile risolvere l'hostname !"
    Quit
  Endif
   
  rev = Risoluzione_DNS_inversa(ip_addr)

  Print "\nTentativo di connessione a '"; indirizzo; "' IP: "; String@(ip_addr)
  Print "\nRisoluzione DNS inversa: "; rev.ToString(0, rev.Find(0))

  sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)
 
  If sockfd < 0 Then
    Print "\nFile-descriptor del Socket non ricevuto !"
    Quit
  Endif
  Print "\nFile-descriptor del Socket"; sockfd; " ricevuto !"
 
  signal(SIGINT, intHandler)
 
  Invia_ping(sockfd, addr_con, rev, ip_addr, indirizzo)

End


Private Function Ricerca_DNS(ind As String, con As Sockaddr_in) As Pointer ' Esegue una ricerca DNS
 
  Dim host_entity As Hostent
  Dim ip As Pointer
 
  Print "\nRisoluzione DNS..."
 
  host_entity = gethostbyname(ind)
 
  ip = inet_ntoa(Int@(Pointer@(host_entity.h_addr_list)))  ' inet_ntoa(*(struct in_addr *) host_entity->h_addr)
 
  con.sin_ = host_entity.h_addrtype
  con.sin_port = PORT_NO
  con.sin_addr = Long@(Pointer@(host_entity.h_addr_list))
 
  Return ip
 
End

Private Function Risoluzione_DNS_inversa(ip_addr As Pointer) As Byte[]
 
  Dim temp_addr As New Sockaddr_in
  Dim socklen, err As Integer
  Dim buf As Byte[]
 
  temp_addr.sin_ = AF_INET
  temp_addr.sin_addr = inet_addr(ip_addr)
  socklen = Object.sizeof(temp_addr)
 
  buf = New Byte[NI_MAXHOST]
 
  err = getnameinfo(temp_addr, socklen, buf.Data, buf.Count, 0, 0, NI_NAMEREQD)
  If err < 0 Then
    Print "Impossibile la risoluzione DNS inversa dell'hostname\n"
    Return 0
  Endif
 
  Return buf
 
End


Private Procedure Invia_ping()
 
 
 
End
« Ultima modifica: 19 Settembre 2020, 14:49:38 da vuott »
« 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 Praino

  • Gamberetto
  • *
  • Post: 24
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #9 il: 19 Settembre 2020, 12:55:12 »
Ciao a tutti :)
Interessante il codice di VUOTT...
ho visto i precedenti codici ed effettivamente non vorrei usare il comando "SHELL" ma un codice diretto
intrinseco di Gambas.
Scusate se prendo sempre da esempio VB5&6 ma qui si poteva usare "WinSock"...
Esiste per Gambas ?
Vorrei realizzare, (intanto imparo  :coder:), un programma che da Linux mi permetta di avere a "colpo d'occhio", lo stato di diversi PC della mia rete e acceder ma ci anche, (ma questo è il futuro ;)).
In Vb6 l'ho realizzato e funziona alla grande....
Il mio obiettivo è realizzarlo anche per linux


Offline Gianluigi

  • Moderatore globale
  • Senatore Gambero
  • *****
  • Post: 4.244
  • Tonno verde
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #10 il: 19 Settembre 2020, 13:13:43 »
...ma un codice diretto intrinseco di Gambas.
...In Vb6 l'ho realizzato e funziona alla grande....
Il mio obiettivo è realizzarlo anche per linux

Credo tu debba guardare al componente gb.net:
http://gambaswiki.org/wiki/comp/gb.net?l=it

 :ciao:
nuoto in attesa del bacio di una principessa che mi trasformi in un gambero azzurro

Offline Praino

  • Gamberetto
  • *
  • Post: 24
    • Mostra profilo
Re:Ping a altra macchina nella rete lan locale con Gambas
« Risposta #11 il: 19 Settembre 2020, 14:20:56 »
Ottimo.
Fantastico...
 :ok: