Russian Qt Forum
Июнь 15, 2024, 22:39 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Срыв сервера при подключении к нему QTcpSocket  (Прочитано 4594 раз)
kramolnic
Гость
« : Январь 30, 2011, 04:56 »

Доброго времени суток!

Есть сервер, написанный на C под Linux/GCC (без Qt). Есть клиент на Си под Linux/GCC на сокетах. Клиент нормально подключается к серверу и нормально работает. Сервер очень простой: после подключения клиента ожидает вполне определенный пакет (авторизация) и в случае, если пакет не верен, принудительно отключает клиента.

Делаю реализацию клиента на C++/Qt под Win XP. Использую QTcpSocket. Код для подключения брал из Qt-шных примеров. При попытке установить соединение с сервером (connectToHost) сервер фиксирует подключение, после чего, судя по выводу в консоль, ему прилетают какие-то данные - он разрывает соединение (т.к. принятый пакет (откуда он там?) не является авторизацией) затем сервер фиксирует повторное подключение клиента (сокет решил, что произошла ошибка и решил повторить попытку?) и опять отключает клиента... и так несколько раз, после чего вылетает с ошибкой выделения памяти. Я не спорю, что на сервере возможна ошибка (хотя клиент на Си прекрасно подключается/отключается и сервер нормально разрывает соединение с ним принудительно при необходимости - ни разу проблем не было). Но почему и какие данные могут отсылаться в процессе установления соединения с сервером? Ведь я еще ничего передать не успел.

Суть проблемы: после вызова QTcpSocket::ConnectToHost происходит подключение к серверу; сигнал connected не генерируется; сервер фиксирует получение данных, которые я не отправлял; правильный пакет я отправить не успеваю, поскольку сервер разрывает соединение до того, как сгенерирован сигнал connected.  Не понимаю, в чем дело. Вот код подключения:
Код:
Client::Client(QObject *parent) :
    QObject(parent)
{
    this->builtAuthPkt();//генерирую пакет авторизации - но бестолку, соединение не устанавливается, хотя попытка есть

    tcpSocket  = new QTcpSocket(this);                                   
    connect(tcpSocket, SIGNAL(connected()), this, SLOT(sendAuthString()));
    connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(readData()));
}

//connects client to specified address and port
void Client::connectToHost(const QString & address, quint16 port)
{
    //tcpSocket->abort();
    QHostAddress s_address;
    s_address.setAddress(address);
    tcpSocket->connectToHost(s_address, port, QIODevice::ReadWrite);
 
   QMessageBox msgBox;
    if (tcpSocket->waitForConnected(5000))
        msgBox.setText("Connected!");
    else
        msgBox.setText("Error!"); //сразу после запуска программы сервер фиксирует попытку подключения, а здесь вылетает окно Error!
        msgBox.exec();
}

//не вызывается вообще ни разу
void Client::sendAuthString()
{
   QMessageBox msgBox;
   msgBox.setText("Connected!");
   //msgBox.setText(QString("Data: %0; Sent: ").arg(QString(auth_str.toHex())).arg(this->tcpSocket->write(this->auth_str)));
   msgBox.exec();
}

Тестовая платформа: сервер - под ОС Linux Fedora 10, работает на VMware Player 3.0.1. Клиент - под Win XP SP3, на ней же работает VMware. Qt - сборка от 2010.02.1, но имеет ли это значение? Файрвол выключен, ничего не должно мешать общаться клиенту и серверу.
Записан
merke
Гость
« Ответ #1 : Январь 30, 2011, 08:46 »

Для начала уберите вот это с кода:

Код
C++ (Qt)
QMessageBox msgBox;
   if (tcpSocket->waitForConnected(5000))
       msgBox.setText("Connected!");
   else
       msgBox.setText("Error!"); //сразу после запуска программы сервер фиксирует попытку подключения, а здесь вылетает окно Error!
       msgBox.exec();

Раскидайте вот это по слотам OnConnected и OnError.
Записан
Omg
Гость
« Ответ #2 : Февраль 02, 2011, 14:17 »

Я бы смотрел в слоты прием и отправки инфы, может там чего с типами и порядком напутано... Ведь коннект происходит, но сервер (очевидно) не видя верного пакета отключает клиента.
Записан
kramolnic
Гость
« Ответ #3 : Февраль 19, 2011, 20:47 »

Проблему решил.. отключением Panda Firewall. Хотя в нем соединение было разрешено, он посылал какой-то пакет серверу, разрывая соединение клиента и сервера и обрушивая последний.

Осталось решить проблему, что с сервером, но это уже другая тема. Всем спасибо, тему можно закрывать.
Записан
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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