2014-04-08 2 views
8

현재이 코드를 사용하여 대상 시스템의 ping을 검색합니다. 그러나 리눅스에서만 작동하며 로켈 설정에 따라 달라질 수 있습니다. 창에 대한 지원을 추가하는 것은 훨씬 더 복잡 할 수 있습니다. 대상 시스템의 ping을 얻는 쉬운 방법이나 라이브러리가 있습니까? 나는 주로 Qt로 작업하기 때문에 QSockets로 작업 할 수 있다면 이상적입니다.Qt를 사용하여 원격 대상에서 핑을 얻으십시오 (Windows/Linux)

#ifndef _WIN32 
QProcess ping; 
ping.start("ping", QStringList() << "-c 1" << m_sHostName); 
if(ping.waitForFinished(250)) { 
    while(ping.canReadLine()) { 
     QString line = ping.readLine(); 
     if(line.contains("time=")) { 
      int iStart = line.indexOf("time=") + 5; 
      int iStop = line.indexOf(" ms"); 
      QStringRef latency(&line, iStart, iStop-iStart); 

      m_vNetwork_s.append(time_s); 
      m_vLatency_ms.append(QString(latency.toLocal8Bit()).toDouble()); 
      break; 
     } 
    } 
} 
#endif 
+0

Qt를 사용하는 ICMP와 관련하여이 링크를 찾았습니다. http://lists.qt-project.org/pipermail/interest/2013-January/005746.html Qt의 네트워크 클래스로는 불가능한 것처럼 보입니다. –

답변

2

당신은 QAbstractSocket없이이를위한 코드를 작성해야합니다. 즉,이 기본 클래스는이 사용 사례를 위해 설계되지 않았습니다.

이유는 원시 소켓을 사용하고 루트로 실행해야하기 때문입니다. 그래서 보통 리눅스에서 ping 실행 파일에 setuid 플래그가 설정되어있는 것을 볼 수 있습니다.

는 ICMP는 "연결형"이며, 같은 Qt는 클래스가에 가능하지로는

당신은보다 철저한 설명 in here을 읽을 수있는 등, 특정 호스트로 데이터를 전송 제공하지 않는 한.

11

당신은 윈도우와 리눅스 모두이 사용에 Ping 할 수 있습니다 :

QStringList parameters; 
#if defined(WIN32) 
    parameters << "-n" << "1"; 
#else 
    parameters << "-c 1"; 
#endif 

    parameters << m_sHostName; 

    int exitCode = QProcess::execute("ping", parameters); 
    if (exitCode==0) { 
     // it's alive 
    } else { 
     // it's dead 
    } 
+1

이 접근 방식의 문제점은 호스트 시스템의 모든 언어에 대한 명령 행 출력을위한 파서를 정의해야한다는 것입니다. 또한이 방법으로 인해 오버 헤드가 발생하며 잠글 수 있습니다. 개인적으로 나는이 방법을 너무 싫어한다! 반면에 이론상으로는 이미 대부분의 시스템에 솔루션이 있어야하기 때문에 그러한 핑퐁 방법을 직접 구현하지는 않았습니다. – dgrat

+1

위에서 설명한 코드는 종료 코드 만 반환하므로 출력을 구문 분석 할 필요가 없습니다. 또한 잠금을 피하기 위해 스레드에 놓을 수 있습니다. – Nejat

+0

그러나 ms로 핑을 플롯하려면 * 어쨌든 * ms 구문을 분석해야합니다. 종료 상태는 ms 단위 지연이 아닙니다. – dgrat

6

Nejat의 코드가 나를 위해 작동하지 않았습니다. 어쩌면 Windows 전용 (Windows 7 x64 + Qt 5.6에서 테스트) 일 수 있습니다. Ping 명령은 고유 한 매개 변수와 값으로 보입니다. QProcess를 만들 때 Ping 명령을 전달해야합니다.

"-n 1"을 한 번에 전달하는 대신 "-n"과 "1"을 별도로 전달해야합니다. 기본적으로

, Nejat의 코드로는 다음과 같습니다

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

테스트 지금 작업.

관련 문제