Poco :: Net :: FTPClientSession зависает на 129 секунд в методе open (), если ftp-хост не существует - PullRequest
0 голосов
/ 19 июня 2020

Я использую библиотеки poco для доступа к ftp-серверу на yocto linux (hw - микроконтроллер). Если я укажу действительный адрес (хост ftp), все будет работать правильно, если я использую несуществующий адрес ftp, метод "open" зависнет на 129 секунд! После этого он выдает следующий Poco :: Exception ..

displayText->"N4Poco9ExceptionE"
what->"Exception"
message->""
name->"Exception"
code->"110"

здесь код ..

Poco::Net::FTPClientSession ftp;
try
{
    ftp.open(host,port);     <<<<<<<<<  hangs here   
    ftp.login(userName,password);
    ftp.logout();
    ftp.close();
}
catch(Poco::Exception exc)
{
} 

Методы setTimeout () работают только после вызова метода open () (в противном случае это вызывает исключение). Однако, если я установил внутреннюю переменную _timeout с помощью хака указателя c ++, не повезло ... похоже, не связано с таймаутом ftp.

Если я сломаю отладчик, это будет стек ..

1 __libc_connect connect.c 26 0xffffbe68bb8c 
2 ??                          0xffffbf1b1ab0 
3 ??  

(подключение. c)

#include <sys/socket.h>
#include <sysdep-cancel.h>
#include <socketcall.h>

int    __libc_connect (int fd, __CONST_SOCKADDR_ARG addr, socklen_t len)
{
#ifdef __ASSUME_CONNECT_SYSCALL
  return SYSCALL_CANCEL (connect, fd, addr.__sockaddr__, len);    <<< THE DEBUGGER BREAKS HERE
#else
  return SOCKETCALL_CANCEL (connect, fd, addr.__sockaddr__, len);
#endif
}

Заранее благодарим за вашу помощь. С уважением,

Alex

1 Ответ

0 голосов
/ 19 июня 2020

Если никто не знает, как решить с помощью объекта poco FTPClientSession, я могу попытаться выполнить этот вызов (QT lib) перед FTPClientSession :: open () ..

QTcpSocket socket;
socket.connectToHost("xxx.xxx.xxx.198",21);
bool bConnected = socket.waitForConnected(10*1000); //ms
...