Цитата(BRE @ 17.9.2011, 22:28)
Ну так QDataStream так и читает.
откуда тогда пустые данные
Цитата(BRE @ 17.9.2011, 22:28)
Расскажи подробней что передается/принимается и как это выглядит в коде.
просто строка длинной более MTU
Сервер в методе incomingConnection
while(socket.isValid())
{
if (socket.waitForReadReady())
{
...
}
}
socket.close();
Клиент
while(socket.isValid())
{
QDataStream stream(&socket);
stream << QString("...");
if (socket.waitForReadReady())
{
QString data;
stream >> data;
...
}
}
З.Ы. Есть еще проблема. Когда сервер рвет соединение, то клиенту сразу приходит сигнал.
А вот если клиент рвет, со серверу пофигу. Вот тестовый код
#include <QtCore/QCoreApplication>
#include <QTcpServer>
#include <QTcpSocket>
#include <QCoreApplication>
class Client {
private:
QTcpSocket m_socket;
public :
Client () {}
~Client() {}
void connect (void)
{
m_socket.connectToHost(QHostAddress::LocalHost, 7777);
if (!m_socket.waitForConnected())
{
QT_THROW(m_socket.errorString());
}
qDebug("CONNECTED !!!");
}
void disconnect(void)
{
m_socket.close();
qDebug("DISCONNECTED !!!");
}
bool isValid(void) const { return m_socket.isValid(); }
};
class Server : public QTcpServer {
private:
Client m_client;
virtual void timerEvent ( QTimerEvent * event )
{
static uint counter = 0;
switch (++counter)
{
case 1 : m_client.connect(); break;
case 2 : m_client.disconnect(); break;
}
}
virtual void incomingConnection( int session )
{
QTcpSocket socket(this);
socket.setSocketDescriptor(session);
while (socket.isValid())
{
Q_ASSERT(m_client.isValid()); // Здесь сработает ASSERT, но socket.isValid() :)
qApp->processEvents();
}
socket.close();
}
public :
Server ()
{
if (!listen(QHostAddress::Any, 7777))
{
QT_THROW(QTcpServer::errorString());
}
startTimer(100);
}
virtual ~Server() {}
};
int main(int argc, char *argv[])
{
QCoreApplication a(argc, argv);
Server server;
return a.exec();
}