Russian Qt Forum

Qt => Установка, сборка, отладка, тестирование => Тема начата: Viktor от Май 26, 2016, 15:43



Название: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 26, 2016, 15:43
Есть tcp сервер и он исправно работает на Windows, но когда я перекинул его на Astra Linox, то он перестал запускаться. Ошибок никаких не выдаёт, просто не запускается консоли и пишет, что Сервер НЕ запущен.... Пробовал и пересобирать и заново писать, но всё никак. Может кто знает в чём может быть проблема? Везде стоит Qt 5 версии.

Вот код:

#include "tcpserver.h"

tcpServer::tcpServer(QObject *parent) : QTcpServer(parent)
{
    clientSocket = new QTcpSocket(this);
    serverSocket = new QTcpSocket(this);

    connect(serverSocket,SIGNAL(readyRead()),SLOT(readSocket())); //Коннект чтения сокета
}
tcpServer::~tcpServer()
{}

//Функция, которая слушает клиента и объявляет запущен ли сервер или нет
bool tcpServer::server_start(QHostAddress addr, qint16 port)
{
   if (!listen(addr, port))
   {
       qDebug() << "Ошибка при запуске сервера!";
       return false;
   }
   else
   {
        qDebug() << "Сервер успешно запущен!";
        return true;
   }
}

//Функция, которая принимает соединение
void tcpServer::incomingConnection(int socketDescriptor)
{
    clientSocket->connectToHost(QHostAddress::LocalHost, 60000);
    qDebug()  << "Сокет" << socketDescriptor << "Успешно установил соединение!\n";

       if(!serverSocket->setSocketDescriptor(socketDescriptor))
       {
           emit error(serverSocket->error());
           return;
       }
}

//Функция чтения
void tcpServer::readSocket()
{
    packetIN.clear();
    QDataStream in(serverSocket);
    for(;;)
    {
        if(!next_block_size)
        {
            if(serverSocket->bytesAvailable() < sizeof(quint16))
                break;
        }
        in >> next_block_size;
        if(serverSocket->bytesAvailable() < next_block_size) break;
        in >> socketHeader;
        in >> packetIN;
        next_block_size = 0;
    }
    qDebug() << "***Приём пакета с заголовком: " << socketHeader;

    emit requestTOBD(socketHeader, packetIN); //Сигнал чтения
}

//Функция записи (Записывает заголовок и массив из строк)
void tcpServer::writeSocket(QByteArray socketHeader, QList<QStringList> tableData)
{
    //QTextStream out(stdout);
    QByteArray block;
    QDataStream st(&block, QIODevice::WriteOnly);
    st << quint16(0)<< socketHeader << tableData;
    st.device()->seek(0);
    st << quint16(block.size() - sizeof(quint16));
    clientSocket->write(block);
    //out << "***Отправка пакета с заголовком: " <<  socketHeader << endl;
    qDebug()<< "***Отправка пакета с заголовком: " <<  socketHeader << endl;
}

[/color]


Название: Re: Не запускается TcpServer на Linux
Отправлено: Alex Custov от Май 26, 2016, 15:57
Возможно проблема с параметрами addr, port. Возможно также, что т.к. Astra - это ОС для спецведомств, то там может быть впилен брэндмауэр, который запрещает слушать порты.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 26, 2016, 16:40
Возможно проблема с параметрами addr, port. Возможно также, что т.к. Astra - это ОС для спецведомств, то там может быть впилен брэндмауэр, который запрещает слушать порты.

Спасибо за мысль....а то вообще идей никаких нет(

И если это действительно так, то что тогда можно сделать? Или вообще подключиться по tcp соединению не получится?


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 26, 2016, 16:48
Какой вы используете номер порта?
Наверное < 1024?


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 26, 2016, 17:10
Какой вы используете номер порта?
Наверное < 1024?

60000


Название: Re: Не запускается TcpServer на Linux
Отправлено: Hvzh от Май 26, 2016, 17:26
А errno для listen вывести никак не получится?


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 26, 2016, 17:33
2 Viktor

Присоединяюсь к Hermann
А errno для listen вывести никак не получится?

Покажите что возвращает
QAbstractSocket::SocketError QTcpServer::serverError() const
и
QString QTcpServer::errorString() const


Название: Re: Не запускается TcpServer на Linux
Отправлено: Hvzh от Май 26, 2016, 17:43
И вот еще что. При успехе listen возвращает 0. А у Вас это интерпретируется как ошибка.


Название: Re: Не запускается TcpServer на Linux
Отправлено: PimenS от Май 26, 2016, 17:49
И вот еще что. При успехе listen возвращает 0. А у Вас это интерпретируется как ошибка.

Почему 0? Вроде Returns true on success; otherwise returns false.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Hvzh от Май 26, 2016, 17:50
Почему 0? Вроде Returns true on success; otherwise returns false.
RETURN VALUE

       On success, zero is returned.  On error, -1 is returned, and errno is
       set appropriately.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 26, 2016, 17:56
Почему 0? Вроде Returns true on success; otherwise returns false.
У ТС вызывается метод listen класса QTcpServer.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Hvzh от Май 26, 2016, 17:56
Упс... Ошибочка... Я listen'ы перепутал...


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 11:19
2 Viktor

Присоединяюсь к Hermann
А errno для listen вывести никак не получится?

Покажите что возвращает
QAbstractSocket::SocketError QTcpServer::serverError() const
и
QString QTcpServer::errorString() const


Ничего не пишет. Возможно я что-то не так делаю?
Я добавил сигнал

connect(serverSocket, SIGNAL(error(QAbstractSocket::SocketError)), this, SLOT(onError(QAbstractSocket::SocketError)));

и функцию

void tcpServer::onError(QAbstractSocket::SocketError socketError) const
{
    switch (socketError) {
    qDebug()<<serverSocket->errorString();
        break;
    case QAbstractSocket::RemoteHostClosedError:
        break;
    case QAbstractSocket::HostNotFoundError:
    default:
        break;
    }
}


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 11:33
Ничего не пишет. Возможно я что-то не так делаю?

Сразу после вызова listen добавьте строку:
Код
C++ (Qt)
qDebug() << serverError() << errorString();
 


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 11:46
Ничего не пишет. Возможно я что-то не так делаю?

Сразу после вызова listen добавьте строку:
Код
C++ (Qt)
qDebug() << serverError() << errorString();
 


Так так, пишет:
"The bound address is already in use"

Не понятно, как он может уже использоваться?

Получается, что какой бы я порт не использовал - пишут одно и то же.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 11:48
Не понятно, как он может уже использоваться?

sudo netstat -lnp


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 15:18
Не понятно, как он может уже использоваться?

sudo netstat -lnp


Ввёл, не могу найти своё соединение! Нашёл только соединение клиентское, которое должно подключиться к серверу и у него статус LISTEN.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 15:21
Ввёл, не могу найти своё соединение! Нашёл только соединение клиентское, которое должно подключиться к серверу и у него статус LISTEN.
Как может "клиентское подключение" слушать порт?


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 15:36
Ввёл, не могу найти своё соединение! Нашёл только соединение клиентское, которое должно подключиться к серверу и у него статус LISTEN.
Как может "клиентское подключение" слушать порт?

у меня же сервер может тоже клиенту что-то передавать. Вообще связь такая: клиент посылает запрос серверу, сервер запрос обрабатывает и получает данные из базы данных и отсылает эти данные клиенту.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 15:43
у меня же сервер может тоже клиенту что-то передавать. Вообще связь такая: клиент посылает запрос серверу, сервер запрос обрабатывает и получает данные из базы данных и отсылает эти данные клиенту.
Для передачи в обе стороны можно использовать один канал. Т.е. клиент подключается к серверу, формируется канал связи, у каждой стороны появляется сокет, через который стороны как получают, так и отправляют данные.
Для чего серверу подключаться к клиенту? Для чего клиент слушает порт, да еще и такой же как сервер?


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 16:16
у меня же сервер может тоже клиенту что-то передавать. Вообще связь такая: клиент посылает запрос серверу, сервер запрос обрабатывает и получает данные из базы данных и отсылает эти данные клиенту.
Для передачи в обе стороны можно использовать один канал. Т.е. клиент подключается к серверу, формируется канал связи, у каждой стороны появляется сокет, через который стороны как получают, так и отправляют данные.
Для чего серверу подключаться к клиенту? Для чего клиент слушает порт, да еще и такой же как сервер?

я в этой теме новичок...приму к сведению.
может тогда у меня получился не клиент сервер, а сервер сервер - тогда?

После того, как я прописал netstat -nlp отобразили все подключения и так же отобразились 2-а моих "сервера" и у всех статус LISTEN. Сервер запустился, но они не законектились....


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 16:23
может тогда у меня получился не клиент сервер, а сервер сервер - тогда?
Получается так. :)
В таком случае лучше не называть их клиентом и сервером, т.к. они равноправны. Лучше их называть пирами (peer), как в i2p сетях.

После того, как я прописал netstat -nlp отобразили все подключения и так же отобразились 2-а моих "сервера" и у всех статус LISTEN. Сервер запустился, но они не законектились....
А порты прослушиваемые у них какие?


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 16:39
Один прослушивает порт 43000
Другой прослушивает порт 45000


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 16:41
Один прослушивает порт 43000
Другой прослушивает порт 45000
Ну т.е. разные порты.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 16:44
Один прослушивает порт 43000
Другой прослушивает порт 45000
Ну т.е. разные порты.

да, порты слушают разные....

Вот у меня ещё со стороны второго сервера такие ошибки вскакивают, может в них проблема?

(http://savepic.ru/9888313m.jpg) (http://savepic.ru/9888313.htm)


А это в netstat -nlp отображается

(http://savepic.ru/9859640m.jpg) (http://savepic.ru/9859640.htm)


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 16:54
Вот у меня ещё со стороны второго сервера такие ошибки вскакивают, может в них проблема?
Это вы про ошибки fontconfig?
Нет это какие-то проблемы настройки шрифтов. Они не причем.

Запускайте ваши программы на разных ip-адресах (не разных компьютерах), тогда не будет конфликтов по портам.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 17:07
Вот у меня ещё со стороны второго сервера такие ошибки вскакивают, может в них проблема?
Это вы про ошибки fontconfig?
Нет это какие-то проблемы настройки шрифтов. Они не причем.

Запускайте ваши программы на разных ip-адресах (не разных компьютерах), тогда не будет конфликтов по портам.

Хм...логика просматривается, возможно вы и правы. Это же всё таки Linux. На днях попробую так сделать. Надеюсь, что получится и проблема была в этом.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Old от Май 27, 2016, 17:09
Это же всё таки Linux.
Да как бы в других ОС должно быть также, протокол tcp/ip на всех платформах должен работать одинаково.


Название: Re: Не запускается TcpServer на Linux
Отправлено: Viktor от Май 27, 2016, 17:12
Это же всё таки Linux.
Да как бы в других ОС должно быть также, протокол tcp/ip на всех платформах должен работать одинаково.

Странно, почему у меня тогда на Windows всё отлично функционирует. Ладно, позже попробую сделать на разных машинах и напишу о результате. Благодарю за помощь!