Newsgroup: it.comp.programmare.win32
Titolo: ping in C++

Salve a tutti,
sono nuovo e spero di aver trovato il NG giusto in cui postare :P
In primis mi presento, mi chiamo MarkuS e diciamo che st� riscoprendo il c e
il c++..e sin qu� tutto va pi� o meno bene...quando ho cercato di passare a
Borland C++ Builder..� stato un po' traumatico...ma forse � colpa mia...in
ogni caso mi st� ambianetando in fretta :)
Vado al sodo...devo creare una applicazione che effettui il PING di un host
datogli in INPUT verifichi se questo � positivo o meno, se il ping non ha
successo lo deve evidenziare, inserire in un DB Access e inviare una mail ad
un indirizzo predefinito...Tralasciando DB e mail per il momento il
problema, come da oggetto, � il PING..
In C++ (shell) sono riuscito a realizzare la cosa con la seguente
istruzione:
 system (("ping " + host).c_str());
dove host � la variabile in INPUT corrispondente all'indirizzo IP....
Passandola sul listato "visuale" mi da il seguente errore:
[BCC32 Error] Unit3.cpp(32): E2034 Cannot convert 'wchar_t *' to 'const char
*'
[BCC32 Error] Unit3.cpp(32): E2342 Type mismatch in parameter '__command'
(wanted 'const char *', got 'wchar_t *')
Qualcuno potrebbe aiutarmi?? Vi pregoooooo!!! :(( :'(
--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 IP....
Che versione di BCB stai utilizzando? Supponendo che host sia di 
tipo String dovrebbe compilare correttamente, comunque puoi 
anche provare con:
system(String("ping " + host).c_str());
Cos� facendo per� il ping viene eseguito da shell. Per qualcosa 
di pi� "robusto" potresti sfruttare la libreria ICMP.DLL.
[OT]
Stai sviluppando esattamente ci� che ho realizzato poco tempo fa 
con tanto di gestione host su database, invio e-mail in caso di 
errore, ecc. Se ti pu� interessare, una versione con meno 
funzionalit�, ma freeware (MultiPinger) la trovi qui: 
http://www.esse-effe.com/multipinger.asp
.
[/OT]
-- 
Stefano Frosio
www.esse-effe.com

 
mi accodo, le funzioni da utilizzare sono:
IcmpCreateFile
IcmpSendEcho
IcmpCloseHandle
Cerca la documentazione su MSDN.

 (wanted 'const char *', got 'wchar_t *')
la funzione system() richiede un parametro di un certo tipo (forse "const char*") mentre tu gli sti passando un altro tipo 
(probabilmente il "wide char*", che sarebbe una stringa in formato utf-16).
Molto probabilmente quell'"host" � di tipo wide.
Fai una prova: system("ping 192.168.999.999");  e vedi se compila.
Erano belli i tempi del Basic, quando bastava dichiarare tutto con una semplice dim senza nemmeno specificare il tipo....!
:-)
Marco

Innanzitutto grazie a tutti per il tempo e l'attenzione dedicatami e per le
risposte postate..
Allora...la soluzione prospettatami da Stefano mi d� il medesimo errore..
mentre per quello che diceva Marco: se gli passo system (ping 2.255.2.209);
(ad esempio) funziona..l'avvo gi� testato in questo senso..
Per quanto riguarda la risposta di Kan...cambia qualcosa se uso Borland C++
Builder anzich� Visual Studio riguardo le librerie ICMP.DLL??
La versione di BCB dovrebbe essere l'ulima..ho scaricato il trial dal sito..


 trial dal sito..
Quindi la 2009. Probabilmente c'� qualche problema per via di 
Unicode.
Per� se non posti un po' pi� di codice la vedo dura aiutarti. In 
particolare, di che tipo � host?
-- 
Stefano Frosio
www.esse-effe.com

Ti posto subito il tutto :)
Host � String cmq...
Uhm, altra cosa.....ah si...ho dato uno sguardo a Echo....per� devo capire
come usarlo :P
Codice:
//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop
#include <iostream>
#include <string>
#include <windows.h>
using namespace std;
static string ping_again;
#include "Unit3.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm3 *Form3;
//---------------------------------------------------------------------------
__fastcall TForm3::TForm3(TComponent* Owner)
	: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm3::Button1Click(TObject *Sender)
{
	String host,pingstring; //dichiaro le variabili per prendere in INPUT l'IP
	host = this->Edit1->Text; // acquisisco il valore del campo di testo Edit1
	//controllo che la variabile testo (Edit1) non sia vuota
	if ( host == ' ') {
		ShowMessage("NON HAI INSERITO ALCUN TESTO!"); //se vuota notifico l'errore
	}
	else {
	pingstring = "ping "+host;
	ShowMessage("Eseguo il ping di "+ host + "?");


 ShowMessage("Eseguo il ping di "+ host + "?");
Non ho BCB2009 quindi non posso esserne sicuro, ma prova cos�:
system(AnsiString(pingstring).c_str());
HTH,
-- 
Stefano Frosio
www.esse-effe.com

Stefano, non ho parole: GRAZIE :)
Funziona!!!!!
Mi apre la finestra dos e pinga....a pensarci la finestra potrebbe anche non
aprirla ma vabb�....
MI potresti spiegare, se non chiedo troppo, qual'era il problema?
Markus
Il 31 Lug 2009, 09:25, "Stefano Frosio"
<stefanofros...@GRAZIEgmail.com> ha scritto:

--------------------------------
Inviato via 
http://arianna.libero.it/usenet/

 problema?
Come gi� detto, stavi passando alla system() una stringa Unicode 
(che sono diventate il default in BCB2009) e quindi il 
compilatore ti dava errore.
-- 
Stefano Frosio
www.esse-effe.com

 compilatore ti dava errore.
 Capito..
Beh ora ho risolto il problema del ping e mi � sorto quello della query
INSERT..
Ho creato il DB access, ho settato la connessione con TADOConnection...poi
ho inserito un TADOQuery..mettendo Active "False" e ho editato SQL con
"INSERT INTO esito_ping (host, esito, data) VALUES (host, esito_ping,
data_ping);"
La query in se dovrebbe essere sintatticamente corretta ma, se messa cos�,
quando vado a rimettere Action su TRUE mi dice "Nessun valore predefinito
per il parametro host...che poi sarebbe il primo che cerco di passargli...
Penso di averle provate tutte ma indubbiamente non ho provato quella
giusta.. :(
.::MarkuS::.


 passargli...
E' corretto. Se provi la query direttamente in Access ti dar�
pi� o meno lo stesso messaggio chiedendoti di mettere un valore
per i parametri. Devi fare la stessa cosa da codice specificando
cio� i tre valori ogni volta che vuoi eseguire la query.
-- 
Stefano Frosio
www.esse-effe.com