Russian Qt Forum
Ноябрь 23, 2024, 02:16 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1] 2   Вниз
  Печать  
Автор Тема: Не запускается TcpServer на Linux  (Прочитано 14432 раз)
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]
« Последнее редактирование: Май 26, 2016, 15:44 от Viktor » Записан
Alex Custov
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2063


Просмотр профиля
« Ответ #1 : Май 26, 2016, 15:57 »

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

Возможно проблема с параметрами addr, port. Возможно также, что т.к. Astra - это ОС для спецведомств, то там может быть впилен брэндмауэр, который запрещает слушать порты.

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

И если это действительно так, то что тогда можно сделать? Или вообще подключиться по tcp соединению не получится?
« Последнее редактирование: Май 26, 2016, 16:43 от Viktor » Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Май 26, 2016, 16:48 »

Какой вы используете номер порта?
Наверное < 1024?
Записан
Viktor
Гость
« Ответ #4 : Май 26, 2016, 17:10 »

Какой вы используете номер порта?
Наверное < 1024?

60000
Записан
Hvzh
Гость
« Ответ #5 : Май 26, 2016, 17:26 »

А errno для listen вывести никак не получится?
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #6 : Май 26, 2016, 17:33 »

2 Viktor

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

Покажите что возвращает
QAbstractSocket::SocketError QTcpServer::serverError() const
и
QString QTcpServer::errorString() const
Записан
Hvzh
Гость
« Ответ #7 : Май 26, 2016, 17:43 »

И вот еще что. При успехе listen возвращает 0. А у Вас это интерпретируется как ошибка.
Записан
PimenS
Крякер
****
Offline Offline

Сообщений: 371


Просмотр профиля
« Ответ #8 : Май 26, 2016, 17:49 »

И вот еще что. При успехе listen возвращает 0. А у Вас это интерпретируется как ошибка.

Почему 0? Вроде Returns true on success; otherwise returns false.
Записан
Hvzh
Гость
« Ответ #9 : Май 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.
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #10 : Май 26, 2016, 17:56 »

Почему 0? Вроде Returns true on success; otherwise returns false.
У ТС вызывается метод listen класса QTcpServer.
Записан
Hvzh
Гость
« Ответ #11 : Май 26, 2016, 17:56 »

Упс... Ошибочка... Я listen'ы перепутал...
Записан
Viktor
Гость
« Ответ #12 : Май 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;
    }
}
Записан
Old
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4350



Просмотр профиля
« Ответ #13 : Май 27, 2016, 11:33 »

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

Сразу после вызова listen добавьте строку:
Код
C++ (Qt)
qDebug() << serverError() << errorString();
 
Записан
Viktor
Гость
« Ответ #14 : Май 27, 2016, 11:46 »

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

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


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

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

Получается, что какой бы я порт не использовал - пишут одно и то же.
« Последнее редактирование: Май 27, 2016, 12:02 от Viktor » Записан
Страниц: [1] 2   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.092 секунд. Запросов: 23.