Доброго времени суток!
Есть сервер, написанный на 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, но имеет ли это значение? Файрвол выключен, ничего не должно мешать общаться клиенту и серверу.