Добрый день.
Пишу программу для соединения с прибором по TCP. Программа на компьютере выступает сервером.
Я обнаружил, что задержка подтверждения Tcp пакета 125 - 250 миллисекунд, в зависимости от мощности компьютера сервера.
Создал тестовых клиента и сервера. Проекты прикладываю. Задержки подтверждения сохраняются.
Это нормально? Какое должно быть типовое время Ack, при работе в одной сети (через роутер)?
В сервере перенос сокета в отдельный поток не изменило ничего.
Я обратил внимание на время подтверждения пакета Тcp т.к. в приборе стоит uIP стек https://ru.wikipedia.org/wiki/UIP_(micro_IP). Этот стек ждет Ack на пакет, и только после этого посылает следующий.
Qt 5.3.1, Windows 7
Клиент.
C++ (Qt)
#include <iostream>
#include <QCoreApplication>
#include <QTcpSocket>
#include <QTimer>
#include <QHostAddress>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTcpSocket * socket = new QTcpSocket;
QObject::connect(socket, static_cast<void(QTcpSocket::*)(QAbstractSocket::SocketError)>(&QTcpSocket::error), [=]()
{
std::cout << socket->errorString().toStdString() << std::endl;
});
socket->connectToHost(QHostAddress("192.168.0.6"), 10000);
QTimer * timer = new QTimer;
timer->start(100);
QObject::connect(timer, &QTimer::timeout, [=]()
{
QByteArray data = "Some data";
if (socket->write(data) != -1)
{
std::cout << "data sent ok" << std::endl;
}
});
return a.exec();
}
Сервер.
C++ (Qt)
#include <iostream>
#include <QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QHostAddress>
#include <QObject>
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
QTcpSocket * socket = nullptr;
QTcpServer * server = new QTcpServer;
QObject::connect(server, &QTcpServer::newConnection, [&]()
{
if (socket)
{
delete socket;
}
socket = server->nextPendingConnection();
std::cout << "Connection established." << std::endl;
if (socket)
{
QObject::connect(socket, &QTcpSocket::disconnected, []()
{
std::cout << "Connection lost." << std::endl;
});
QObject::connect(socket, static_cast<void (QTcpSocket::*)(QAbstractSocket::SocketError)>(&QAbstractSocket::error), [&] (QAbstractSocket::SocketError)
{
std::cout << "Error " << socket->errorString().toStdString() << std::endl;
});
}
});
if (!server->listen(QHostAddress("192.168.0.6"), 10000))
{
std::cout << "Can't start server:";
std::cout << server->errorString().toStdString() << std::endl;
return 0;
}
std::cout << "Server started." << std::endl;
//QThread * serverThread = new QThread;
//server->moveToThread(serverThread);
//serverThread->start(QThread::TimeCriticalPriority);
return a.exec();
}