Discussione:
ping in C++
(troppo vecchio per rispondere)
.::MarkuS::.
2009-07-29 23:22:52 UTC
Permalink
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/
Stefano Frosio
2009-07-30 10:02:30 UTC
Permalink
Post by .::MarkuS::.
system (("ping " + host).c_str());
dove host è la variabile in INPUT corrispondente all'indirizzo 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
Kan
2009-07-30 12:42:12 UTC
Permalink
Post by Stefano Frosio
Post by .::MarkuS::.
system (("ping " + host).c_str());
dove host è la variabile in INPUT corrispondente all'indirizzo IP....
Che versione di BCB stai utilizzando? Supponendo che host sia di
tipo String dovrebbe compilare correttamente, comunque puoi
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.
mi accodo, le funzioni da utilizzare sono:
IcmpCreateFile
IcmpSendEcho
IcmpCloseHandle

Cerca la documentazione su MSDN.
Marco
2009-07-30 15:05:10 UTC
Permalink
Post by .::MarkuS::.
system (("ping " + host).c_str());
dove host è la variabile in INPUT corrispondente all'indirizzo IP....
[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 *')
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
.::MarkuS::.
2009-07-30 17:43:15 UTC
Permalink
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..

--------------------------------
Inviato via http://arianna.libero.it/usenet/
Stefano Frosio
2009-07-30 18:25:18 UTC
Permalink
Post by .::MarkuS::.
cambia qualcosa se uso Borland C++
Builder anzichè Visual Studio riguardo le librerie ICMP.DLL??
No, nulla.
Post by .::MarkuS::.
La versione di BCB dovrebbe essere l'ulima..ho scaricato il
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
.::MarkuS::.
2009-07-30 20:20:46 UTC
Permalink
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 + "?");

}
}

--------------------------------
Inviato via http://arianna.libero.it/usenet/
Stefano Frosio
2009-07-31 07:25:51 UTC
Permalink
Post by .::MarkuS::.
host = this->Edit1->Text;
this puoi ometterlo.
Post by .::MarkuS::.
if ( host == ' ')
if (host.IsEmpty())
Post by .::MarkuS::.
pingstring = "ping "+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
.::MarkuS::.
2009-07-31 16:39:33 UTC
Permalink
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"
Post by Stefano Frosio
Post by .::MarkuS::.
host = this->Edit1->Text;
this puoi ometterlo.
Post by .::MarkuS::.
if ( host == ' ')
if (host.IsEmpty())
Post by .::MarkuS::.
pingstring = "ping "+host;
ShowMessage("Eseguo il ping di "+ host + "?");
system(AnsiString(pingstring).c_str());
HTH,
--
Stefano Frosio
www.esse-effe.com
--------------------------------
Inviato via http://arianna.libero.it/usenet/
Stefano Frosio
2009-07-31 18:15:05 UTC
Permalink
Post by .::MarkuS::.
MI potresti spiegare, se non chiedo troppo, qual'era il
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
.::MarkuS::.
2009-07-31 21:21:29 UTC
Permalink
Post by Stefano Frosio
Come già detto, stavi passando alla system() una stringa Unicode
(che sono diventate il default in BCB2009) e quindi il
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::.


--------------------------------
Inviato via http://arianna.libero.it/usenet/
Stefano Frosio
2009-08-03 11:27:08 UTC
Permalink
Post by .::MarkuS::.
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...
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
Continua a leggere su narkive:
Loading...