Форум программистов, компьютерный форум, киберфорум
Наши страницы

"Настоящий" TCP KEEPALIVE (Win\Lin)(client)

Войти
Регистрация
Восстановить пароль
Оценить эту запись

"Настоящий" TCP KEEPALIVE (Win\Lin)(client)

Запись от saqef размещена 27.10.2017 в 13:12

Отличие от сервера заключается в отсутствии сервера
Поэтому у вас не будет
C++ (Qt)
1
clientSocket->socketDescriptor();
Посему: или запускать сервер на клиенте, или вот так:
Кликните здесь для просмотра всего текста
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
void MainWindow::ping()
{
    const QString host_address=mySocket->peerAddress().toString();
    if(host_address.isEmpty())
    {
        ui->textEdit->append("ping:address.isempty");
        if(mySocket->isOpen())
            mySocket->close();
    }
 
#ifdef DEBUG
        qDebug()<<"core: trying to ping host:"<<host_address;
#endif
 
        bool boolRESULT=false;
 
        int ping_timeout=500;
        QString exe_path;
        #ifdef Q_OS_WIN32
            exe_path="C:\\Windows\\system32\\ping.exe";
        #endif
        #ifdef Q_OS_LINUX
            exe_path="/bin/ping";
        #endif
 
        if(!QFile::exists(exe_path))
        {
#ifdef DEBUG
            qDebug()<<"core: ERROR:"<<exe_path<<"not found!";
#endif
            ui->textEdit->append("core: ERROR:"+exe_path+"not found!");
            boolRESULT=false;
        }
        else
        {
            QStringList arguments;
             #ifdef Q_OS_WIN
                //QTextCodec::setCodecForCStrings(QTextCodec::codecForName("cp-866"));
                arguments<<host_address;
            #endif
            #ifdef Q_OS_LINUX
               // QTextCodec::setCodecForCStrings(QTextCodec::codecForName("UTF-8"));
                arguments<<host_address<<"-c 1";
            #endif
 
            QProcess myProcess;
            myProcess.start(exe_path,arguments);
            if(myProcess.waitForFinished(ping_timeout))
            {
                QStringList strlstPingResults;
                strlstPingResults<<myProcess.readAll();
 
 
                QString strResult="";
                for (int i=0;i<=strlstPingResults.count()-1;i++)
                {
    #ifdef DEBUG
                    qDebug()<<"core: ping results:"<<strlstPingResults[i];
    #endif
                    strResult='\n'+strlstPingResults[i];
                    boolRESULT=strlstPingResults[i].contains("ttl",Qt::CaseInsensitive);
                    if (boolRESULT)
                        break;
                }
                myProcess.close();
                myProcess.deleteLater();
            }
        }
 
        if (!boolRESULT)
        {
            ui->textEdit->append("no ping");
            if(mySocket->isOpen())
                mySocket->close();
        }
        else
        {
             //ui->textEdit->append("ping:result true");
        }
 
}


Протестировано на win 8.1/10, ubuntu 16.04
(qt 5.9.1)
Если пишете не под Qt просто поменяйте Qt-шные типы на свои.
Размещено в Без категории
Просмотров 202 Комментарии 0
Всего комментариев 0

Комментарии

 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru