تشغيل بينغ مع Qprocess, كود الخروج دائما 2 إذا كان المضيف أو لا يمكن الوصول إليها

StackOverflow https://stackoverflow.com/questions/1052411

  •  20-08-2019
  •  | 
  •  

سؤال

أنا باستخدام Qprocess تنفيذ الأمر ping للتحقق من المضيف على الإنترنت أو لا...

المشكلة هي أن الخروج التعليمات البرمجية التي لا تلقي من Qprocess->الانتهاء من الإشارة دائما 2 لا يهم إذا كنت بينغ قابلة للوصول أو المضيف غير قابلة للوصول واحد..

أنا باستمرار الأزيز في QTimer إلى المضيف(الذي مجلد واحد لقد شنت على العميل حيث Qt تشغيل التطبيق)...

عندما قبض على رمز الإنهاء كما عاد من قبل بينغ في فتحة متصلة QProcess->الانتهاء من إشارة..أنا دائما تلقي رمز الإنهاء 2..

أنا غير قادر على استخدام المباشر استدعاء النظام من خلال نظام(بينغ) كما توقف بلدي التطبيق للمرة بينغ نشطة...أريد أن يكون غير متزامن لذلك أنا تحولت إلى QProcess...

التالي هو مقتطف الشفرة:

//Pinging function called inside a timer with timout 1000        
QString exec="ping";
        QStringList params;
        if(!dBool)
        {
            //params << "-c1 1.1.1.11 -i1 -w1;echo $?";
            params <<" 1.1.1.11 -i 1 -w 1 -c 1";//wont ping
            cout<<"\n\npinging 11 ie wont ping";
        }
        else
        {
            //params << "-c1 1.1.1.1 -i1 -w1;echo $?";
            params <<" 1.1.1.1 -i 1 -w 1 -c 1";//will ping
            cout<<"\n\npinging 1 ie will ping";
        }
        ping->start(exec,params);
// the slot that connects with QProcess->finished signal
void QgisApp::pingFinished( int exitCode, QProcess::ExitStatus exitStatus )
{
    cout<<"\n\nexitCode,exitStatus=="<<exitCode<<","<<exitStatus;//always 2,0!!
    if(exitCode==0)
    //if(dBool)
    {
        connectivity=true;
        cout<<"\n\nONLINE";
    }
    else
    {
        connectivity=false;
        cout<<"\n\nOFFLINE";
    }
}   

على

cout<<"\n\nexitCode,exitStatus=="<<exitCode<<","<<exitStatus

الخط دائما يعطي 2,0 الناتج لا يهم إذا 1.1.1.1 هو بنج أو 1.1.1.11 هو بنج على محطة 1.1.1.1 هو pingable و 1.1.1.11 ليس (أنا التبديل bw ips خلال dBool العلم الذي يقع على الحدث keypress لمحاكاة على الانترنت/غير متصل المضيف بحيث بلدي التطبيق يمكن أن تتصرف وفقا لذلك)

أي مدخلات سيكون مساعدة كبيرة..

شكرا

هل كانت مفيدة؟

المحلول

أعتقد أنه من سوء الممارسة إلى الاعتماد على ping.exe رمز الإنهاء كما انها لا يحملون وثائق.وعلاوة على ذلك أنه كان من المعروف أن في الإصدارات المختلفة من نظام التشغيل Windows رمز الإنهاء غير متناسقة.

هل يمكن أن:

  • تنفيذ الخاص بك بينغ.هناك الكثير الحرة تطبيقات هناك مثل هذا (أول واحد عند البحث "بينغ.ج" في جوجل).
  • تحليل ping.exe الإخراج و تحديد ما إذا كان بينغ كانت ناجحة أم لا.

تحرير:

لم أدرك أنك تعمل مع لينكس (في المرة القادمة قد يكون من الحكمة أن يذكر في السؤال)...

جرب هذا عند إرسال الحجج بينغ:

params << "1.1.1.11" << "-i" << "1" << "-w" << "1" <<"-c" <<"1";

بدلا من واحدة كبيرة السلسلة.

نصائح أخرى

وليس هناك وسيلة عبر منصة جيدة للقيام بذلك. ولكن يمكنك استخدام منصة طرق محددة. يمكنك بينغ على كل من Windows و Linux باستخدام هذا:

#if defined(WIN32)
   QString parameter = "-n 1";
#else
   QString parameter = "-c 1";
#endif

int exitCode = QProcess::execute("ping", QStringList() << parameter << "1.1.1.11");
if (exitCode==0) 
{
    // it's alive
} else 
{
    // it's dead
}

ويمكنك استخدام ping-> تنفيذ (العودة الباحث) بدلا من ping-> بدء. بالنسبة لي كان يعمل !!!

وVladiyork

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top