2014-09-19 2 views
2

QTcpSocket을 사용하여 피어에 연결을 시도하는 Linux Qt5/C++ 응용 프로그램을 작성하고 있습니다. 전화 :Linux에서 setsockopt를 사용하여 연결 시간 제한을 설정하십시오.

tcpsocket->connectToHost(address,port,options) 

피어를 사용할 수있을 때 바로 사용할 수 있으며 즉시 연결됩니다. 그러나 피어를 사용할 수없는 경우 : 위의 첫 번째 호출 할 때 연결 SocketTimeoutError (5) 받기 전에 1 분 기다립니다. 그런 다음 Connection을 호출 할 때마다 ConnectionRefusedError (0)가 수신되거나 1 분 (테스트 된 시스템에 따라 다름)을 기다릴 수도 있습니다.

초기 연결 대기 시간을 줄이기 위해 사용할 수있는 setsockopt가 있습니까?

내가 잃어버린 연결 (아래 참조)을 알리기 위해 이미 소켓 옵션을 설정했다는 것을 지적해야합니다. 희망이는 일분 초기 연결 오류 지연의 원인이되지 않습니다

int enableKeepAlive = 1; 
setsockopt(fd, SOL_SOCKET, SO_KEEPALIVE, &enableKeepAlive, sizeof(enableKeepAlive)); 
int maxIdle = 5; /* seconds */ 
setsockopt(fd, IPPROTO_TCP, TCP_KEEPIDLE, &maxIdle, sizeof(maxIdle)); 
int count = 3; // send up to 3 keepalive packets out, then disconnect if no response 
setsockopt(fd, SOL_TCP, TCP_KEEPCNT, &count, sizeof(count)); 
int interval = 2; // send a keepalive packet out every 2 seconds (after the 5 second idle period) 
setsockopt(fd, SOL_TCP, TCP_KEEPINTVL, &interval, sizeof(interval)); 
+0

Google에서 setsockopt (socket_handle, SOL_TCP, OPT_CONNECT_TIMEOUT 및 option, sizeof (옵션))에 대한 참조가 하나 있지만 OP_CONNECT_TIMEOUT이 없으므로 컴파일되지 않습니다. (적어도 내 헤더에는 포함되지 않음) – TSG

답변

0

을 대신 비 블록 모드로 소켓을 설정하지 않는 이유 setsockopt()에 의존하고 비동기 connect()을 수행하기보다는. 그런 다음 select(), poll() 또는 사용중인 이벤트 디 멀티플렉싱 메커니즘을 차단하고 제한 시간을 원하는 값으로 설정하십시오. 쓰기가 가능 해지면 연결이 완료되었음을 알 수 있습니다.

+0

연결을 차단하여 socketerror 신호를 발생시킵니다. (QT를 사용하여 선택 또는 폴링 없음). 나는 또한 짧은 시간 내에 만료되도록 별도의 타이머를 실행할 수 있음을 알고 있지만 소켓 옵션을 찾고 있습니다. – TSG

+0

@GenerationDSystems : 비 차단 연결 시간 제한을 설정하려면 소켓 옵션을 설정해야합니다. 내가 이해하는 것부터 [connectToHost()'] (http://qt-project.org/doc/qt-5/qabstractsocket.html#connectToHost)는 타임 아웃없이 즉시 리턴하고'connected()'신호를 내야한다. 일단 연결되면 나는 그것을 암시 한 너 자신에게 [비슷한 문제에 관한 오래된 게시물] (http://www.qtcentre.org/threads/37051-QTcpSocket-connectToHost%28%29-is-blocking-the-GUI!)을 발견했다. 시스템/드라이버 문제 일 수 있습니다. 다른 플랫폼에서도 문제가 발생합니까? – Void

+0

나는 그 질문을 이해하지 못한다고 생각합니다. 오류 신호를 내기 전에 소켓이 연결을 시도 할 수있는 최대 시간을 설정하고 싶습니다. 순간 1 분, 나는 그것을 <5 초 필요 – TSG

관련 문제