Newsgroup: it.comp.lang.visual-basic
Titolo: comando IP

Ciao a tutti esiste un comando che mi permetta di visualizzare l'indirzzo ip 
del mio router?
Il comando non deve essere necessariamente in visual, può anche essere un 
comando avviabile da "promt di dos".
Grazie a tutti 

 del mio router?
Intendi l'indirizzo che ti viene assegnato dall'ISP?

Esatto 

 Esatto
La soluzione che adotto io è questa (che certamente potrebbe non essere
la migliore): su un sito web esterno metti una pagina che ti dice
l'indirizzo IP di chi la visita:
in ASP:
<%
Response.Write Request.ServerVariables("REMOTE_ADDR")
Response.End
%>
in PHP:
<?
die($_SERVER['REMOTE_ADDR']);
?>
e poi ti vai a leggere quella pagina. Se lo vuoi fare da codice VB6 puoi
usare le API InternetOpen(), InternetOpenUrl(), InternetReadFile(),
InternetCloseHandle().
Se non hai la possibilità di crearti una tua pagina asp/php su un sito
esterno, puoi usare altri siti già esistenti (per esempio
www.whatismyip.com
 ), ma:
1) devi cercare l'indirizzo IP all'interno della struttura HTML della
pagina che scarichi
2) la suddetta struttura può cambiare, e ti ritrovi a piedi.

Ciao, mi credi se ti dico che sono circa due mesi che cerco un' anima buona 
come te che mi dia questa dritta!
Ora ho le idee molto piu chiare.
Una sola cosa non riesco ancora a capire:
il comando INET.OPENURL(" ")
E' una funzione API? se si, bisogna installarla?
Io per quanto concerne l'installazione di visual basic ho eseguito quella 
standard, quindi se servono componenti aggiuntivi ce li devo mettere!
Un'altra cosa:
Il comando INET.OPENURL(" ")
è la stessa cosa del comando InternetOpenUrl() che tu mi proponi?
Ti ringrazio infinitamente 

 è la stessa cosa del comando InternetOpenUrl() che tu mi proponi?
Serve un po' di spiegazione...
Windows funziona in base a delle librerie di funzioni (tutte quelle DLL
dentro la cartella C:\Windows\System32). E queste funzioni, che non sono
quelle che usi di solito in Visual Basic, si chiamano API (che sta per
application program interface). Per poterle usare in VB, devi dire in
quale libreria stanno, oltre a specificare quali parametri vogliono
(questo perchè, essendo esterne al VB, il compilatore non le conosce).
Ergo, per esempio, per usare l'api InternetOpenUrl devi prima scrivere
(in testa al codice, fuori da tutte le Sub e Function) questo (è tutto
su un'unica riga):
Declare Function InternetOpenUrl Lib "wininet" Alias "InternetOpenUrlA"
(ByVal hInternetSession As Long, ByVal lpszUrl As String, ByVal
lpszHeaders As String, ByVal dwHeadersLength As Long, ByVal dwFlags As
Long, ByVal dwContext As Long) As Long
Quello cui ti riferisci tu (INET.OPENURL) è invece un componente
(chiamato controllo ocx) che puoi inserire direttamente nei tuoi
applicativi. Devi solo dire al VB che lo vuoi (menu Progetto ->
Componenti). Nel caso specifico, tale componente si chiama "Microsoft
Internet Transfer Control".
Per usarlo, basta cliccare sulla sua iconcina nella barra degli
strumenti e premere F1...
Nota: in questo caso o usi le API (cerca con google come) o usi il
controllo INET - Internet Transfer Control): sono due metodi
alternativi, e direi che per i tuoi fini sono equivalenti. Le differenze
sono:
1) se usi INET e distribuisci il tuo applicativo devi distribuire anche
il componente MSINET.OCX; se usi le API non devi distribuire nulla in
quanto la libreria wininet.dll (che contiene le funzioni InternetOpenUrl
 et similia) c'è già in tutte le versioni di Windows.
2) se usi INET devi posizionare tale controllo in una Form, mentre le
api vanno messe solamente nel codice.
3) INET è più semplice da usare se hai poca dimestichezza col codice.

 2) la suddetta struttura può cambiare, e ti ritrovi a piedi.
Questo, in ogni caso... anche un banale problema sulla rete rende 
inefficace il sistema.
Ciao!
-- 
Gianluca Cannalire
Microsoft MVP/MCP - Visual Basic
http://www.visual-basic.it
http://community.visual-basic.it/gianluca

Guarda, non so come ringraziarti, dopo oltre due mesi di prove ci sono
riuscito. Tutto grazie a te che mi hai detto un piccolo dettaglio che mai
nessuno mi aveva detto!
Devo chiederti una cosa:
L'indirizzo ip l'ho fatto scrivere dentro un file.doc
Se voglio scriverlo in un file txt ci riesco perň anzichč vedere l'ip vedo
una serie di quadrati! Immagino sia un problema di codifica.
Hai soluzioni da proporre?
grazie mille 

 una serie di quadrati! Immagino sia un problema di codifica.
Potrebbe essere... Hai provato la funzione StrConv ?

No, non l'ho provata. Ora mi informo sulla guida. Grazie mille! 

Perfetto risolto il problema!
Ascolta, se io oltre alla stringa con l'ip volessi anche inserire il 
contenuto del comand IPCONFIG / ALL
come dovrei fare? Suppongo che ci sia una funzione che mi consente di 
eseguire il comando e scriverlo in una variabile.
tu che dici? 

 ha scritto nel messaggio 
news:Hi2me.1457234$35.54...@news4.tin.it...


Cristiano Magno ha scritto:

Vorresti ricavare informazioni tipo quelle visualizzate dal comando
ipconfig /all? Ossia:
- nome macchina
- mac address della/e scheda/e di rete
- indirizzo ip
- maschera di sottorete
- Indirizzo ip del gateway e del dns?
Se è così, non ho capito di quale macchina? Del modem/router o della
macchina che l'utente sta usando?

Allora, faccio prima a spiegarti tutto il mio programma:
Io sto creando un programma che crei un file di testo e lo invii via email.
ho suddiviso il lavoro in due parti:
1) creare il file di testo
2) spedirlo
Per quanto riguarda la spedizione ci penserň.
Ora mi sto focalizzando su alcune problematiche legate al file di testo.
Voglio che all'interno del file siano presenti i seguenti dati:
1) indirizzo ip PUBBLICO (ci sono gia riuscito anche grazie a te)
2) tutti i dati derivanti dall'esecuzione del comando ipconfig /all
3) Un timer che esegua un conto alla rovescia e che dopo un tot di secondi 
mi chiuda il programma.
4) Varie ed eventuali!
Allora il punto uno č gia fatto ora devo gestire il punto 2!
Mi sai aiutare? 

 2) tutti i dati derivanti dall'esecuzione del comando ipconfig /all
Se vuoi semplicemente spedire per email i dati ritornati da ipconfig
/all allora ti basta fare come ha consigliato Marco R.: esegui il comando
ipconfig /all >NomeFile
quindi ti vai a leggere il file "NomeFile"
A prima vista ti basterebbe fare una semplice Shell. Questo comando però
 fa una cosa semplice:
1) lancia l'esecuzione del programma
2) l'esecuzione in VB continua, indipendentemente dal fatto che il
programma lanciato con Shell sia terminato o no
Per questo motivi occorre qualche linea di codice in più, per verificare
che il comando lanciato (nel tuo caso ipconfig /all >NomeFile) sia
terminato. Per questo occorre usare un paio di funzioncine api:
iProc=Shell("ipconfig /all >NomeFile", WindowState)
hProc=OpenProcess(PROCESS_QUERY_INFORMATION,0&,iProc)
Do
   GetExitCodeProcess hProc,ris
   DoEvents ' o, meglio, la Sleep
Loop While ris=STILL_ACTIVE
Se googli un po' troverai info su queste funzioncine...

Ma sono indispensabili le api? mi sembra un gran casino! 

 Ma sono indispensabili le api? mi sembra un gran casino!
Qualcosa è difficile solo se non la si sa.
Basta applicarsi un po' (a volte un po' tanto) per imparare... Dopo sarà
tutto sempre più semplice, o meglio, la barriera tra facile e difficile
si sposta sempre più lontana.

Hai ragione! Beh vedrò di studiare parecchie cosette! spero ci sarai ancora 
se avrò bisogno! 

Ciao, smanettando un poco sono riuscito ad aprire il cmd:
RetVal = Shell("cmd", 1)
Come faccio a caricare il programma ipconfig /all e i dati scriverli su un 
file? 

Cristiano Magno ha scritto:

1) In un modulo metti questo codice:
Private Enum kOpenProcess_DesiredAccess
   PROCESS_QUERY_INFORMATION = &H400&
End Enum
Private Enum kOpenProcess_InertiHandle
   Vero = -1&
   Falso = 0&
End Enum
Private Const STILL_ACTIVE As Long = &H103
Private Declare Function OpenProcess Lib "kernel32" ( _
   ByVal dwDesiredAccess As kOpenProcess_DesiredAccess, _
   ByVal bInheritHandle As kOpenProcess_InertiHandle, _
   ByVal dwProcessId As Long) As Long
Public Function ShellAndWait(ByVal Programma As String, _
   Optional WindowState As Long = vbNormalFocus) As String
   Dim hPrg As Long, hProc As Long, ris As Long
   Dim ErrNo As Long, Errore As String
   On Error GoTo ShellAndWait_err
   ShellAndWait = ""
   hPrg = Shell(Programma, WindowState)
   hProc = OpenProcess(PROCESS_QUERY_INFORMATION, Falso, hPrg)
   Do
      GetExitCodeProcess hProc, ris
      DoEvents
   Loop While ris = STILL_ACTIVE
   ShellAndWait = ""
ShellAndWait_exit:
   Exit Function
ShellAndWait_err:
   ErrNo = Err.Number
   ShellAndWait = Err.Description
   Err.Clear
   If MsgBox("Si è verificato il seguente errore (" & _
      ErrNo & "=0x" & Hex(ErrNo) & ") " & vbNewLine & _
      "durante l'installazione di """ & Programma & """:" & _
      vbNewLine & Errore, vbRetryCancel Or vbExclamation) = vbRetry Then
      ShellAndWait = ShellAndWait(Programma, WindowState)
   End If
   Resume ShellAndWait_exit
End Function
2) Dove vuoi metti questo codice:
ShellAndWait "cmd /c ipconfig /all >C:\dm.txt"
Il file C:\dm.txt l'ho messo io come esempio, ma può essere un qualsiasi
file. Dopo tale linea di codice avrai nel file C:\dm.txt i dati
risultanti dal comando ipconfig /all.

Ciao!
Ti ringrazio, funziona.
Una cosa però non capisco.
Il mio programma mi crea gia un file con scritto il mio indirizzo ip, se io 
voglio aggiugere altri dati ( quelli derivanti dalla shell) come faccio? Ti 
scrivo il listato:
Shell "cmd /c ipconfig /all >C:\ip.txt"
Dim ip As String
'Utilizzo funzione INET, serve per trasferire l'IP da internet ad una 
variabile.
ip = Inet1.OpenURL("
www.visual-basic.it/utility/getip.asp
")
'conversione del testo, serve affinchè l'ip venga visualizzato come stringa
'all'interno del file.
ip = StrConv(ip, vbUnicode)
'Scrittura sul file.
Open "c:\ip.txt" For Input As #1
Put #1, , ip
Close #1
End Sub
Con questo metodo, mi dice errore.
Cosa mi consigli? 

 Close #1
Qui ti guardi l'help (basta selezionare la parola Open e premere F1):
vedrai che la parola chiave "For Input" serve per leggere i file, non
per scriverci dentro.
Poi, al posto della "Put #" userei la "Print #"...