Russian Qt Forum

Qt => Работа с сетью => Тема начата: qtист от Апрель 02, 2009, 11:13



Название: Отловить сообщения от ping
Отправлено: qtист от Апрель 02, 2009, 11:13
Наверное в этот раздел постю

есть код:

Код
C++ (Qt)
QHostAddress aa;
QHostInfo info;
 
info =info.fromName("pupkin");
if (!info.addresses().isEmpty())
{
    aa = info.addresses().first();
}
str=QString("ping %1").arg(aa.toString());
QProcess pong;
pong.execute(str);

как бы мне отловить сообщения от ping'а?
а может и по другоиу надо..... :o


Название: Re: Отловить сообщения от ping
Отправлено: Admin от Апрель 02, 2009, 11:28
про задачку поподробнее - изначально что нада, проверять жив сервак или нет?


Название: Re: Отловить сообщения от ping
Отправлено: qtист от Апрель 02, 2009, 11:45
про задачку поподробнее - изначально что нада, проверять жив сервак или нет?

Примерно,в сети находиться некоторый прибор(промписи),надо узнать включен он или нет.


Название: Re: Отловить сообщения от ping
Отправлено: spirit от Апрель 02, 2009, 11:53
попробуй так
Код
C++ (Qt)
QProcess ping;
ping.start("ping", QStringList() << "prog.org.ru");
if (ping.waitForFinished())
qDebug() << ping.readAll();
 


Название: Re: Отловить сообщения от ping
Отправлено: qtист от Апрель 02, 2009, 13:16
spirit +1

и вдогонку два сопутствующих вопроса:

1.хорошо бы сообщения на русский перевести(кракозябры плохо читаются  :D)
2.а можно не целиком прочитать сообщения,а построчно читать?



Название: Re: Отловить сообщения от ping
Отправлено: pastor от Апрель 02, 2009, 13:31
и вдогонку два сопутствующих вопроса:

1.хорошо бы сообщения на русский перевести(кракозябры плохо читаются  :D)
2.а можно не целиком прочитать сообщения,а построчно читать?

1. QTextCodec::setCodecForCStrings
2. readLine()


Название: Re: Отловить сообщения от ping
Отправлено: qtист от Апрель 02, 2009, 13:41
QTextCodec::setCodecForCStrings - ессно стоит,но ping.readAll() возвращает крякозябры
как я понимаю пока процесс не закончился (waitForFinished),
ни чё возвращаться не будет - пофигу,что readAll(),что readLine() ?


Название: Re: Отловить сообщения от ping
Отправлено: spirit от Апрель 02, 2009, 13:44
если под виндой, то пробуй так
Код
C++ (Qt)
QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp-866"));
QProcess ping;
ping.start("ping", QStringList() << "prog.org.ru");
if (ping.waitForFinished()) {
int count = 0;
while (!ping.atEnd())
qDebug() << ++count << " " << ping.readLine();
}
 


Название: Re: Отловить сообщения от ping
Отправлено: pastor от Апрель 02, 2009, 13:57
как я понимаю пока процесс не закончился (waitForFinished),
ни чё возвращаться не будет - пофигу,что readAll(),что readLine() ?

Неправильно понимаешь. См.

Цитировать
void QProcess::readyReadStandardOutput ()   [signal]


Название: Re: Отловить сообщения от ping
Отправлено: spirit от Апрель 02, 2009, 13:59
ага, лучше читать после этого сигнала, ибо тогда не будет гуй виснуть.


Название: Re: Отловить сообщения от ping
Отправлено: qtист от Апрель 02, 2009, 14:09
spirit построчно получилось ( с меня ещё один стакан spirta)
А вот с кодировкой... и под винду и под linux должно работать
pastor уговорил


Название: Re: Отловить сообщения от ping
Отправлено: Mixolap от Апрель 02, 2009, 17:03
Вот еще ссылка по теме: http://qt.shamangrad.net/doku.php?id=%D1%80%D0%B5%D0%B0%D0%BB%D0%B8%D0%B7%D0%B0%D1%86%D0%B8%D1%8F_%D0%BF%D1%80%D0%BE%D0%B2%D0%B5%D1%80%D0%BA%D0%B8_%D0%BD%D0%B0%D0%BB%D0%B8%D1%87%D0%B8%D1%8F_%D0%BF%D0%B8%D0%BD%D0%B3%D0%B0_%D0%B0%D0%B4%D1%80%D0%B5%D1%81%D0%BE%D0%B2


Название: Re: Отловить сообщения от ping
Отправлено: crackedmind от Апрель 02, 2009, 19:10
Если пишется под винду, можно воспользоваться этими API функциями
Цитировать
IcmpCloseHandle
IcmpCreateFile
IcmpParseReplies
IcmpSendEcho
IcmpSendEcho2
Из библиотеки Ip helper. И ничего парсить не придется.


Название: Re: Отловить сообщения от ping
Отправлено: qtист от Апрель 06, 2009, 11:03
Сделал красиво  ;D,работает везде

Код
C++ (Qt)
QProcess *ping;
ping = new QProcess ();
connect( ping, SIGNAL(readyReadStandardOutput ()), this, SLOT(print_ping()) );
ping->start("ping", QStringList() << "pupkin"  );
......
 
void Proga::print_ping()
{
   QByteArray      output;
 
   output = ping->readAllStandardOutput ();
   ui.textEdit->append(output.data()); //вывод в гуи
 
}

во как ;D