Форум программистов, компьютерный форум, киберфорум
C++ Qt
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.53/15: Рейтинг темы: голосов - 15, средняя оценка - 4.53
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474

TCP UDP Взаимодействие в QT

17.11.2018, 00:49. Показов 3346. Ответов 4
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Приветствую, уважаемые.

Разрабатываю приложение частью функционала которого является клиент - серверное двустороннее взаимодействие через QUDP или QTCP.
По выбору.
Про UDP: Размер датаграмм ограничен. Пусть как в примере ниже 256 байт. Соответственно сообщение может быть порезано на кусочки и отправлено по частям, к каждому фрагменту/датаграмме присобачен ХЭШ оригинала - ну чтобы проверить что все ОК. Алгоритм Соломона - Рида в последствии присобачу.Итак: вот класс frs_udp.cpp
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
#include "frs_udp.h"
#include "loginpage.h"
#include <syslog.h>
 
#include <QString>
 
FRS_UDP::FRS_UDP(QObject *parent) : QObject(parent)
{
 
}
//--------------------------------------------------------------------------------------------------------------------
 
int FRS_UDP::PortBinding(int port)
{
    int result = 0;
    p_udpSocket = new QUdpSocket(this);
    p_udpSocket->bind(port, QUdpSocket::ShareAddress);
    PPortB=port;
    QString PortDisplay = QString::number(PPortB);
    connect(p_udpSocket, SIGNAL(readyRead()), this, SLOT(ReadMessage()));
    //connect(p_udpSocket, SIGNAL(readyRead()), this, SLOT(ReceiveFile()));
    return result;
}
//--------------------------------------------------------------------------------------------------------------------
 
void FRS_UDP::ReadMessage()
{
    QString IP;             //Sender IP
    int SP;                 //Sender port no.
    while (p_udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(p_udpSocket->pendingDatagramSize());
        QString DatagramSize = QString::number(p_udpSocket->pendingDatagramSize());
        QHostAddress senderIP;
        quint16 senderPort;
        p_udpSocket->readDatagram(datagram.data(), datagram.size(), &senderIP, &senderPort);
 
        qWarning() << "This was received";
        qWarning() << datagram; //This simple receiving. No check
 
        QDataStream Stream(datagram);
        QByteArray ReceivedData;
        Stream >> ReceivedData;
        QByteArray Hash;
        Stream >> Hash;
        if (Hash =="")
            break;
        else
        {
            IP = senderIP.toString().toUtf8();
            SP = senderPort;
            QString SPasString = QString::number(SP).toUtf8();
            qWarning() << "Received datagram: " + ReceivedData;
            qWarning() << "From " + IP + " " + SPasString;
            qWarning() << "Received Datagram size = " + DatagramSize + " Bytes";
            qWarning() << "Original message hash is " + Hash;
            qWarning() << "Received Data is " + ReceivedData;
        }
        if (ReceivedData.length() < 15)
            DataReceived(ReceivedData, IP, SP);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
void FRS_UDP::SendMessage(QString message, int PortNum, QString IPAddr, qint64 DatagramSize)
{
 
    //This have to be sent to restore original message
    QByteArray Hash = QCryptographicHash::hash(message.toUtf8(), QCryptographicHash::Sha3_256).toHex(); //Hash of message have to sent
    int OriginalMessageLen = message.length();                   //Length of original message integer value
    QString OriginalMessageLenAsQB = QString::number(OriginalMessageLen).toUtf8(); //Length of original message text value
 
    //This is needed for cut into datagrams
    int FragCount = 0;                        //Counting fragments to send
    QByteArray *Datagrams = new QByteArray[50];    //Here my fragments array (datagrams)
    std::string *DatagramsAsString = new std::string[50];
    QStringList Piece;
    int i = 0;
 
    // Cut into datagrams
    for (int pos = 0; pos < message.length(); pos += DatagramSize)
    {
        Piece.push_back(message.mid(pos, DatagramSize));
        QString TempDatagram = Piece.back();
        QByteArray TempDatagramAsQB = TempDatagram.toUtf8();  //piece of original message
 
 
        //Assembeling datagram to sent
        QByteArray DatagramAssembeled;    //Contain part of original message and hash of whole original message
        QDataStream stream(&DatagramAssembeled, QIODevice::WriteOnly);
            stream << TempDatagramAsQB;
            stream << Hash;
 
        //Prepare Array for error correction encoding and sending
        Datagrams[i] = DatagramAssembeled;  //Array of datagrams - every datagram - piece of original message and hash
 
        /* Code which modify datagramms in a set into array of char - can be used for Reed–Solomon codes
        DatagramsAsString[i] = Datagrams[i].toStdString();
        char *str = new char [DatagramsAsString[i].length()+1];
        strcpy(str, DatagramsAsString[i].c_str());
        */
 
        i++;
        FragCount++;
    }
 
    //Sending
    p_udpSocket = new QUdpSocket(this);
    for (int ii=0; ii<FragCount; ii++)
    {
        p_udpSocket->writeDatagram(Datagrams[ii].data(), Datagrams[ii].size(), QHostAddress::Broadcast, PortNum);
        qWarning() << "Datagram was sent";
    }
    //Clean memory
    delete [] Datagrams;
    delete [] DatagramsAsString;
}
//--------------------------------------------------------------------------------------------------------------------
 
void FRS_UDP::DataReceived(QString Received, QString SourceIPAddr, int P)
{
    if (Received == "TestMessage") // If it was just a test message
    {
        //Send response about test was passed, server is available
        SendMessage("TestMessageResponseOK", P, SourceIPAddr, 256);
    }
    else // If it was attempt to login
    {
        //Call function for JSON. This function may be as part of separate class have to be developed
    }
 
}
//--------------------------------------------------------------------------------------------------------------------
И его заголовок
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
#ifndef FRS_UDP_H
#define FRS_UDP_H
#pragma once
 
#include <QObject>
#include <QUdpSocket>
#include <iostream>
#include <QVector>
#include <QByteArray>
#include <QCryptographicHash>
#include <QtSerialPort/QSerialPort>
#include <string.h>
#include <QCryptographicHash>
#include <QIODevice>
#include <QDataStream>
#include <QJsonObject>
#include <QJsonDocument>
#include <loginpage.h>
#include <stdio.h>
 
class FRS_UDP : public QObject
{
    Q_OBJECT
 
public:
    explicit FRS_UDP(QObject *parent = nullptr);
    QUdpSocket *p_udpSocket = nullptr;
 
private:
    int PortB;
    int &PPortB = PortB;
 
signals:
 
public slots:
    int PortBinding(int port);
    void ReadMessage();
    void SendMessage(QString message, int PortNum, QString IPAddr, qint64 DatagramSize);
    void DataReceived(QString ReceivedData, QString SourceIPAddr, int PortOfSource);
};
 
#endif // FRS_UDP_H
Вызов из класса loginpage
вот loginpage.h
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
#ifndef LOGINPAGE_H
#define LOGINPAGE_H
 
#include <QWidget>
#include <QMainWindow>
#include <QString>
 
#include "gui_main.h"
#include "frs_udp.h"
#include "frs_tcp.h"
#include "sqlite.h"
#include "ui_loginpage.h"
#include <stdio.h>
 
//--------------------------------------------------------------------------------------------------------------------
 
namespace Ui {
class LoginPage;
}
 
class LoginPage : public QWidget
{
    Q_OBJECT
 
public:
    explicit LoginPage(QWidget *parent = nullptr);
    ~LoginPage();
 
signals:
 
private slots:
    void on_ServerModeCheckBox_stateChanged(int arg1);
    void on_Connect_Reconnect_Button_clicked();
 
private:
    Ui::LoginPage *ui;
    int PortUDP;
    SQLite *PSQLite = new SQLite();
 
};
 
#endif // LOGINPAGE_H
и соответственно срр
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
82
83
84
85
#include <QApplication>
#include "loginpage.h"
 
FRS_UDP *PFRS_UDP = new FRS_UDP();
FRS_TCP *PFRS_TCP = new FRS_TCP();
 
LoginPage::LoginPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LoginPage)
{
    ui->setupUi(this);
    ui->DBStatusReportLabel->setVisible(false);
    if (ui->ServerModeCheckBox->isChecked() == true)
    {
        QString Report = PSQLite->DBConnect();
        ui->DBStatusReportLabel->setText(Report);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
LoginPage::~LoginPage()
{
    delete ui;
}
//--------------------------------------------------------------------------------------------------------------------
 
void LoginPage::on_ServerModeCheckBox_stateChanged(int arg1)
{
    if (ui->ServerModeCheckBox->isChecked() == true)
    {
        ui->Connect_Reconnect_Button->setText("Start");
        ui->ServerIPLabel->setDisabled(true);
        ui->ServerIPLineEdit->setDisabled(true);
        ui->DBStatusReportLabel->setVisible(true);
    }
    else if (ui->ServerModeCheckBox->isChecked() == false)
    {
        ui->Connect_Reconnect_Button->setText("Check Server");
        ui->ServerIPLabel->setDisabled(false);
        ui->ServerIPLineEdit->setDisabled(false);
        ui->DBStatusReportLabel->setVisible(false);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
void LoginPage::on_Connect_Reconnect_Button_clicked()
{
 
    if (ui->UDPUseCheckBox->isChecked() == true)  //For the future. UDP Protocol. Have to fix. frs_udp is a class for it
    {
        qWarning() << "***** UDP mode *****";
        PortUDP = ui->ServerPortLineEdit->text().toInt();
        if (ui->ServerModeCheckBox->isChecked() == true)  //Become UDP Server
        {
            int result = PFRS_UDP->PortBinding(PortUDP);
            if (result == 0)
                qWarning () << "Listenong ...";
            else
                qWarning () << "Listening error ...";
            QString Report = PSQLite->DBConnect();
            ui->DBStatusReportLabel->setText(Report);
        }
        if (ui->ServerModeCheckBox->isChecked() == false)  //Become UDP Client
        {
            QString ServerIP = ui->ServerIPLineEdit->text();
            int DatagramSize = 256;
            PFRS_UDP->SendMessage("TestMessage", PortUDP, ServerIP, DatagramSize);
        }
    }
    else 
    {
        qWarning() << "***** TCP Mode *****";
        if (ui->ServerModeCheckBox->isChecked() == true)  //Become TCP Server
        {
            PFRS_TCP->StartTCPServer();
        }
        if (ui->ServerModeCheckBox->isChecked() == false)  //Become TCP Client
        {
            PFRS_TCP->ConnectToServer();
 
        }
    }
}
 
//--------------------------------------------------------------------------------------------------------------------
Проблема в том, что при отправке небольших сообщений сообщение приходит только один раз и первое. Еще одна отправка с того же клиента или иного клиента не срабатывает - не приходит сообщение. Более того видно что если приходит "TestMessage" то надо ответить клиенту причем именно этому SendMessage("TestMessageResponseOK", P, SourceIPAddr, 256);
И опять. Ответ не проходит. В чем может быть проблема??

Вопрос второй относительно TCP - В примерах какой-то микс TCP UDP чата, а нужно пример TCP взаимодействия (Отправка текста/файлов) причем отдельному клиенту/всем клиентам
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
17.11.2018, 00:49
Ответы с готовыми решениями:

TCP/IP пакеты. Как можно изменить служебные параметры заголовка TCP или UDP?
Всем привет! Работаю с передачей данных через интернет. Как можно изменить служебные параметры заголовка TCP или UDP (флаги, контрольная...

TCP и UDP
Помогите пожалуйста, вообще не понимаю, как это сделать Программа измеряет скорость передачи информации по протоколам TCP и UDP, а также...

TCP и UDP
Вот при отправке данных по TCP - данные передаются как поток байт. И не известен размер порции которую отправляет функция send() за один...

4
 Аватар для weterok
36 / 28 / 9
Регистрация: 11.11.2018
Сообщений: 163
17.11.2018, 21:14
Проверьте пингуется ли адрес. Если пингуется, значит вы могли либо не отправить сообщение, либо его не получить, либо не отправить ответ. Добавьте в код отладку перед каждым посылом сообщений на предмет того, что отправляется. Просмотрите траффик снифером, например wireshark.

Добавлено через 6 минут
И проверьте, вызывается ли фрагмент кода, где вы TestMessage отправляете
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
28.11.2018, 01:33  [ТС]
Чуть более причесанный файл frs_udp.cpp добавил комментариев убрал некоторый мусор

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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include "frs_udp.h"
#include "loginpage.h"
#include <syslog.h>
 
#include <QString>
 
FRS_UDP::FRS_UDP(QObject *parent) : QObject(parent)
{
 
}
//--------------------------------------------------------------------------------------------------------------------
 
int FRS_UDP::PortBinding(int port)
{
    int result = 0;
    p_udpSocket = new QUdpSocket(this);
    p_udpSocket->bind(port, QUdpSocket::ShareAddress);
    connect(p_udpSocket, SIGNAL(readyRead()), this, SLOT(ReadMessage()));
    //connect(p_udpSocket, SIGNAL(readyRead()), this, SLOT(ReceiveFile()));
    return result;
}
//--------------------------------------------------------------------------------------------------------------------
 
void FRS_UDP::ReadMessage()
{
    QString IP;             //Sender IP
    int SP;                 //Sender port no.
    while (p_udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(p_udpSocket->pendingDatagramSize());
        QString DatagramSize = QString::number(p_udpSocket->pendingDatagramSize());
        QHostAddress senderIP;
        quint16 senderPort;
        p_udpSocket->readDatagram(datagram.data(), datagram.size(), &senderIP, &senderPort);
 
        qWarning() << "This was received";
        qWarning() << datagram; //This simple receiving. No check
 
        QDataStream Stream(datagram);
        QByteArray ReceivedData;
        Stream >> ReceivedData;
        QByteArray Hash;
        Stream >> Hash;
        if (Hash =="")
            break;
        else
        {
            IP = senderIP.toString().toUtf8();
            SP = senderPort;
            QString SPasString = QString::number(SP).toUtf8();
            qWarning() << "From " + IP + " " + SPasString;
            qWarning() << "Received Datagram size = " + DatagramSize + " Bytes";
            qWarning() << "Original message hash is " + Hash;
            qWarning() << "Received Data / Datagram is " + ReceivedData;
        }
        if (ReceivedData.length() < 15)
            DataReceived(ReceivedData, IP, SP);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
void FRS_UDP::SendMessage(QString message, int PortNum, QString IPAddr, qint64 DatagramSize)
{
 
    //This have to be sent to restore original message
    QByteArray Hash = QCryptographicHash::hash(message.toUtf8(), QCryptographicHash::Sha3_256).toHex(); //Hash of message have to sent
    int OriginalMessageLen = message.length();                   //Length of original message integer value
    QString OriginalMessageLenAsQB = QString::number(OriginalMessageLen).toUtf8(); //Length of original message text value
 
    //This is needed for cut into datagrams
    int FragCount = 0;                        //Counting fragments to send
    QByteArray *Datagrams = new QByteArray[50];    //Here my fragments array (datagrams)
    std::string *DatagramsAsString = new std::string[50];
    QStringList Piece;
    int i = 0;
 
    // Cut into datagrams
    for (int pos = 0; pos < message.length(); pos += DatagramSize)
    {
        Piece.push_back(message.mid(pos, DatagramSize));
        QString TempDatagram = Piece.back();
        QByteArray TempDatagramAsQB = TempDatagram.toUtf8();  //piece of original message
 
 
        //Assembeling datagram to sent
        QByteArray DatagramAssembeled;    //Contain part of original message and hash of whole original message
        QDataStream stream(&DatagramAssembeled, QIODevice::WriteOnly);
            stream << TempDatagramAsQB;
            stream << Hash;
 
        //Prepare Array for error correction encoding and sending
        Datagrams[i] = DatagramAssembeled;  //Array of datagrams - every datagram - piece of original message and hash
 
        /* Code which modify datagramms in a set into array of char - can be used for Reed–Solomon codes
        DatagramsAsString[i] = Datagrams[i].toStdString();
        char *str = new char [DatagramsAsString[i].length()+1];
        strcpy(str, DatagramsAsString[i].c_str());
        */
 
        i++;
        FragCount++;
    }
 
    //Sending
    p_udpSocket = new QUdpSocket(this);
    for (int ii=0; ii<FragCount; ii++)
    {
        p_udpSocket->writeDatagram(Datagrams[ii].data(), Datagrams[ii].size(), QHostAddress::Broadcast, PortNum);
        qWarning() << "Datagram was sent";
    }
    //Clean memory
    delete [] Datagrams;
    delete [] DatagramsAsString;
}
//--------------------------------------------------------------------------------------------------------------------
 
void FRS_UDP::DataReceived(QString Received, QString SourceIPAddr, int P)
{
    if (Received == "TestMessage") // If it was just a test message
    {
        //Send response about test was passed, server is available
        qWarning () <<"Attempt to send it";
        SendMessage("TestMessageResponseOK", P, SourceIPAddr, 256);
    }
    else // If it was attempt to login
    {
        //Call function for JSON. This function may be as part of separate class have to be developed
        SendMessage("TestMessageResponseOK", P, SourceIPAddr, 256);
    }
 
}
//--------------------------------------------------------------------------------------------------------------------
Дело в том, что пакет размером меньше одной датаграммы отправляется нормально, но потом ни один пакет отправить не получается. То ли не уходит с сервера то ли не принимается клиентом. А вот если пакет больше датаграммы, то все в порядке, можно отправлять большие пакеты сколько угодно.
0
 Аватар для peter_irich
367 / 223 / 53
Регистрация: 18.10.2017
Сообщений: 2,370
28.11.2018, 21:19
flush() не пробовали вызывать?
0
98 / 10 / 0
Регистрация: 21.02.2011
Сообщений: 474
29.11.2018, 00:21  [ТС]
*
Цитата Сообщение от peter_irich Посмотреть сообщение
flush() не пробовали вызывать?
Не знаком. Можно подробнее где это вызвать и что за механизм такой?

Добавлено через 27 минут
LoginPage.cpp С комментариями
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
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
#include <QApplication>
#include "loginpage.h"
 
FRS_UDP *PFRS_UDP = new FRS_UDP();
FRS_TCP *PFRS_TCP = new FRS_TCP();
 
LoginPage::LoginPage(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::LoginPage)
{
    ui->setupUi(this);
    ui->DBStatusReportLabel->setVisible(false);
    if (ui->ServerModeCheckBox->isChecked() == true)
    {
        QString Report = PSQLite->DBConnect();
        ui->DBStatusReportLabel->setText(Report);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
LoginPage::~LoginPage()
{
    delete ui;
}
//--------------------------------------------------------------------------------------------------------------------
 
void LoginPage::on_ServerModeCheckBox_stateChanged(int arg1)
{
    if (ui->ServerModeCheckBox->isChecked() == true)
    {
        ui->Connect_Reconnect_Button->setText("Start");
        ui->ServerIPLabel->setDisabled(true);
        ui->ServerIPLineEdit->setDisabled(true);
        ui->DBStatusReportLabel->setVisible(true);
    }
    else if (ui->ServerModeCheckBox->isChecked() == false)
    {
        ui->Connect_Reconnect_Button->setText("Check Server");
        ui->ServerIPLabel->setDisabled(false);
        ui->ServerIPLineEdit->setDisabled(false);
        ui->DBStatusReportLabel->setVisible(false);
    }
}
//--------------------------------------------------------------------------------------------------------------------
 
void LoginPage::on_Connect_Reconnect_Button_clicked()
{
// ******************************** NO SERVER IS RUNNING ********************************
    if (StatusOfConnection == 0) //No server running
    {
        if (ui->UDPUseCheckBox->isChecked() == true)  //Work over UDP protocol ********************************
        {
            qWarning() << "***** UDP mode *****";
            PortUDP = ui->ServerPortLineEdit->text().toInt();
 
            //Become UDP Server instructions ********************************
            if (ui->ServerModeCheckBox->isChecked() == true)
            {
                int result = PFRS_UDP->PortBinding(PortUDP);
                if (result == 0)
                    qWarning () << "Listening ...";
                else
                    qWarning () << "Listening error ...";
                QString Report = PSQLite->DBConnect();
                ui->DBStatusReportLabel->setText(Report);
                ui->Connect_Reconnect_Button->setText("Stop UDP");
                StatusOfConnection = 1;  //Status: server is running
            }
            //End become UDP server instructions ********************************
 
            //Become UDP client instructions ********************************
            if (ui->ServerModeCheckBox->isChecked() == false)
            {
                QString ServerIP = ui->ServerIPLineEdit->text();
                int DatagramSize = 256;
                PFRS_UDP->SendMessage("TestMessage", PortUDP, ServerIP, DatagramSize);
            }
            //End become UDP Client instructions ********************************
        }
        else //Work over TCP protocol ********************************
        {
            qWarning() << "***** TCP Mode *****";
            PortTCP = ui->ServerPortLineEdit->text().toInt();
 
            //Become TCP server instructions ********************************
            if (ui->ServerModeCheckBox->isChecked() == true)
            {
                StatusOfConnection = PFRS_TCP->StartTCPServer(PortTCP);
                if (StatusOfConnection == 1) //Status: server is running
                {
                    QString Report = PSQLite->DBConnect();
                    ui->DBStatusReportLabel->setText(Report);
                    ui->Connect_Reconnect_Button->setText("Stop TCP");
                }
            }
            //End become TCP server instructions ********************************
 
            //Become TCP client instructions ********************************
            if (ui->ServerModeCheckBox->isChecked() == false)
            {
                PFRS_TCP->ConnectToServer();
 
            }
            //End become TCP Client instructions ********************************
        }
    }
// ******************************** SOME SERVER IS RUNNING ********************************
    else //If some server is running
    {
        //Return to original statement, stop server, disconnect from DB, return button text
        if (ui->ServerModeCheckBox->isChecked() == true)
        {
            ui->Connect_Reconnect_Button->setText("Start");
            QString Report = PSQLite->DBDisconnect();
            ui->DBStatusReportLabel->setText(Report);
            qWarning() << Report;
 
        }
        else
        {
            ui->Connect_Reconnect_Button->setText("Check Server");
        }
 
        StatusOfConnection =0; //All disconnected
    }
}
 
//--------------------------------------------------------------------------------------------------------------------
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.11.2018, 00:21
Помогаю со студенческими работами здесь

UDP и TCP
Здравствуйте! Хотел спросить: если допустим взять UDP и TCP протоколы, и при этом обезопасить UDP (решить проблему с...

UDP/TCP
порекомендуйте книгу по UDP/TCP в которой можно розобратса как работать с этими класами

Tcp udp отличия
Добрый день подскажите пожалуйста Укажите основные отличия между протоколами сетевого уровня - UDP и TCP.

UDP и TCP сервер
Здравствуйте. К сети подключено несколько датчиков, которые периодически отправляют UDP пакеты на основной сервер. Сервер сохраняет...

Server = UDP + TCP
Здравствуйте. У меня несколько вопросов. Во-первых, почему в данном коде не передается признак конца файла(а значит и не происходит выход...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru