Russian Qt Forum

Qt => Работа с сетью => Тема начата: Eugene K от Ноябрь 03, 2019, 09:30



Название: Qt4.1, TCP-server, 150 kbit/s, Ethernet, Windows
Отправлено: Eugene K от Ноябрь 03, 2019, 09:30
В моем коде TCP-сервера есть потери пакетов:

 
Код:
   clientConnection = new QTcpSocket(this);   
    tcpServer = new QTcpServer();
    connect(tcpServer, SIGNAL(newConnection()), this, SLOT(newConnect()));


void frmMain::newConnect()
{
    clientConnection = tcpServer->nextPendingConnection();   
   
    connect(clientConnection, SIGNAL(readyRead()),
            this, SLOT(receivePkg()));   
           
    connect(clientConnection, SIGNAL(disconnected()),
            clientConnection, SLOT(deleteLater()));           
           
}


void frmMain::receivePkg()
{
    read_size = clientConnection->read(buf_c, READ_BUF_SIZE);


Прием делаю в потоке GUI.
Понимаю, что надо сделать в отдельном потоке и, возможно, назначить ему приоритет, но не имею практического опыта как это правильно сделать.

Подскажите как создать TCP-сервер:

-принимает 10+ пакетов (1 пакет = длина 200+ байт) в 1 мс
-прием пакетов длится более 10 мин
-без потерь пакетов

Покажите правильный код сервера.


Название: Re: Qt4.1, TCP-server, 150 kbit/s, Ethernet, Windows
Отправлено: Old от Ноябрь 03, 2019, 09:56
При срабатывании сигнала readyRead в буфере приема могут быть несколько пакетов, в слоте  receivePkg вы должны вычитывать все принятые пакеты.
До прихода новых данных сигнал readyRead эмитется не будет или нужно отключать буферизацию в сокете.
Но лучше вычитывать все пакеты.