2014-11-24 3 views
1

Qt 응용 프로그램에서 연결 시간 초과를 사용자 정의 할 수 있지만 waitForConnected에 대한 인수로 전달하는 숫자와 관계없이 시간 제한은 동일합니다 (약 3 초입니다. 기본값 30).Qt의 waitForConnected에 대한 시간 제한을 설정할 수 없습니다.

예 :

if(socket->waitForConnected(koko)) 
{ 
    ...do stuff... 
} 
else 
{ 
    ...do else stuff... 
} 

아무리에 민숙을 설정 어떤 수, 제한 시간은 약 3 초 정도되는 유지하지 않습니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

내 소켓 연결 :

socket = new QTcpSocket(); 
socket->connectToHost(addres,port); 

:

QHostAddress addres, quint16 port 

과 같은 QLineEdit에서 얻고 민숙 메신저 (제한 시간은 QLineEdit) :

int koko = ui->Timeout->text().toInt()*1000; 
+0

시간 초과가 작동하지 않는다고 말하기 전에 연결할 수없는 호스트에 연결을 시도 했습니까? 제공 한 코드 샘플이 도움이되지 않습니다. 최소한 소켓의 초기화 (QAbstractSocket의 구체적인 유형을 알려주는)와'connectToHost()'에 넣은 매개 변수를 추가하십시오. – Antwane

+0

@Antwane - 그는 타임 아웃이 3 초라고 말합니다. 실제로 소켓을 타임 아웃한다고합니다. 연결 시도에서 성공하기보다는. – dtech

+0

@ddriver 정상적인 동작입니다. connectToHost()가 호출 된 후 연결이 HostLookupState 또는 ConnectingState에있는 경우에만 시간 초과가 실행됩니다. 연결에 실패하면 (UnconnectedState) 메서드는 false를 반환합니다. 연결이 성공하면 (ConnectedState) 메서드는 true를 반환합니다. 그 문서는 분명하다 :'소켓이 연결될 때까지 기다린다, UP TO * msecs * milliseconds'. 연결 상태가 30 초 (기본값) 전에 변경되면 메서드가 더 일찍 반환됩니다. – Antwane

답변

3

:

대기 소켓이 연결될 때까지, 최대에 밀리 밀리 초. 연결이 설정되면이 함수는 true를 반환합니다. 그렇지 않으면 false를 리턴합니다.

약 3 초 후에 거짓을 반환합니다. 그것은 정상적인 행동 일 수 있습니다. 이 코드를 참조하십시오 :

#include <QTcpSocket> 
#include <QTime> 

int main(int, char *) { 
    QStringList hosts; 
    hosts << "127.0.0.1" << "10.1.25.62" << "192.168.1.0"; 
    for(QString host : hosts) { 
     QTime timer; 
     timer.start(); 

     QTcpSocket socket; 
     socket.connectToHost(host, 80); 
     if(socket.waitForConnected(30000)) { 
      qDebug() << host << "-- Connected in" << timer.elapsed(); 
     } else { 
      qDebug() << host << "-- NOT Connected in" << timer.elapsed();; 
     } 
    } 
} 

결과는 다음과 같습니다

"127.0.0.1" -- NOT Connected in 1 
"10.1.25.62" -- NOT Connected in 5997 
"192.168.1.0" -- NOT Connected in 30020 

을 모든 경우에, waitForConnected() 메소드는 false를 돌려줍니다.

  • 먼저 주소 (127.0.0.1)에 도달 할 수 있지만 포트가 닫힙니다. 연결이 즉시 실패합니다.
  • 그런 다음 (같은 네트워크에있는) 주소가 있지만 포트가 닫혔는지 감지하는 데 약간 시간이 걸립니다. 6 초 후 실패합니다.
  • 마지막으로 192.168.1.0에 도달 할 수 없으므로 연결이 실패했는지 확인하려면 전체 시간 초과가 필요합니다.

는 (여전히 Qt는 문서에서) 마음에 또 다른 중요한 정보를 보관하십시오 :

참고 :이 기능은 Windows에서 무작위로 실패 할 수 있습니다. 소프트웨어가 Windows에서 실행될 경우 이벤트 루프 및 connected() 신호를 사용하는 것을 고려하십시오.

문제가 될 수도 있습니다. Windows에서 실행합니까?

+0

예이 인스턴트 메신저를 Windows에서 실행, 지금은 다른 옵션을 시도하는 사람, D 조 – Edgarth

0

이 메소드는 true를 반환나요 또는 거짓? true가 반환되면 연결이 설정됩니다. 설명서에 따르면 waitForConnected()는 연결에 대해 최대 30 초 동안 대기하지만 이전에 연결이 설정되면 직접 반환됩니다. Qt documentation for QAbstractSocket에서

+0

나는 그것이 이전에 말했던 것처럼 허위, 문제는 여기에 돌아올 것이라고 확신한다. 기다리는 시간은 늘 상처 입는다. 내가 코코에 넣은 것은 아니다. – Edgarth

1

나는 보통이 그렇게 :

int iTrial=0; 
int iMaxTrials=200; 
int iTimeOut=20; 

do { 
    pTcpSocket->connectToHost(QHostAddress::LocalHost,uPort); 
} while (!pTcpSocket->waitForConnected(iTimeOut) && ++iTrial < iMaxTrials); 

그것은 적극적으로 시도 4 초 동안 연결합니다. 매개 변수를 예를 들어로 변경하고 싶을 수 있습니다. 타임 아웃 = 200; maxtrials = 150으로 30 초 동안 기다립니다.

관련 문제