Seite 1 von 1
QT4:QTcpSocket: Daten werden nicht gesendet obwohl connected
Verfasst: 4. Mai 2007 13:14
von nando
Hi...
Ich habe einen QTcpSocket der mit einem Server verbunden ist.
Wenn ich nun versuche daten zu senden zeigt mir write an, dass daten gesendet wurden... es kommt aber nix an....
mein senden sieht so aus:
Code: Alles auswählen
void
Client::connectedSlot()
{
if(!isValid()) {
DTG_ERROR("Client::connectedSlot: Socket is invalid!");
return;
}
if(state() != QAbstractSocket::ConnectedState)
{
DTG_ERROR("Client::connectedSlot: Socket not connected!");
return;
}
QTextStream in(&m_TestDataFile);
while (!in.atEnd()) {
m_line = in.readLine();
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_2);
out << (quint16)0;
out << m_line.toAscii();
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));
int n = write(block);
DTG_DEBUG("Sent " << n << " bytes:" << m_line.size());
usleep(static_cast<__useconds_t>(0.25 * 1000000));
}
}
wie man sieht sende ich aus dem connectedSlot....
die verbindung wird auch aufgebaut aber die meldungen kommen nicht an..
auch wird der slot :bytesWritten nicht aufgerufen.... also ist das problem wohl wirklich hier auf der client seite...
weiss jemand, was ich falsch mache ?
Gruss,
Nando
Verfasst: 4. Mai 2007 13:24
von Christian81
Einfach mal schauen ob am Client wirklich nichts ankommt - ich denke nicht dass es an dem geposteten Code liegt.
Mit WireShark oder was auch immer mal testen.
Verfasst: 4. Mai 2007 14:43
von nando
du meinst ob am server nix ankommt...
ja hab ich gemacht...
es werden keine daten gesendet!!
die verbindung besteht aber....
ggrrr... zum verrueckt werden...
hab auch schon nen anderen port versucht...
firewall laeuft auch keine....
echt komisch dass write mir korrekt die bytes zurueck gibt, aber in wireshark nix zu sehen ist............
Verfasst: 4. Mai 2007 15:25
von nando
Ich hab es jetzt hinbekommen..
Man darf nicht aus dem slot die while schleife aufrufen und senden.
ich mach das jetzt so, dass ich, wenn ich connected bin einen QTimer starte.
und immer wenn der timer ablaeuft lese ich die naechste zeile aus der datei und sende diese....
ich glaub ich hab die event-verarbeitung blockiert....
jetzt funktioniert es wunderbar
Code: Alles auswählen
Client::Client(QObject *pParent) :
QTcpSocket(pParent),
m_serverPort(12111),
m_TestDataFileName("testdata_eddf.adexp"),
m_TestDataFile(m_TestDataFileName)
{
DTG_DEBUG("Client::Client:");
.
.
.
.
m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(timeoutSlot()));
}
void
Client::timeoutSlot()
{
DTG_DEBUG("Client::timeoutSlot:");
if( !m_in.atEnd()) {
m_line = m_in.readLine();
m_line.append("\n");
QTextStream out(this);
out << m_line.toAscii();
DTG_DEBUG("Sent line: " << m_line.toStdString());
}
else {
DTG_DEBUG("Client::timeoutSlot: All data sent -> closing file.");
m_TestDataFile.close();
}
}
bool
Client::start()
{
DTG_DEBUG("Client::start: ");
if(!m_TestDataFile.open(QIODevice::ReadOnly| QIODevice::Text)) {
DTG_ERROR("Client::Client: Couldn't open testdata file: " <<
m_TestDataFileName.toStdString());
return false;
}
m_in.setDevice(&m_TestDataFile);
QString ip("10.240.67.40");
DTG_DEBUG("Client::start: connecting to host: " << ip.toStdString() << ":" << m_serverPort);
connectToHost(QHostAddress(ip), m_serverPort);
DTG_DEBUG("Client::Client: testdata file: " <<
m_TestDataFileName.toStdString() << " opened succesfully.");
return true;
}
void
Client::connectedSlot()
{
DTG_DEBUG("Client::connectedSlot:");
if(!isValid()) {
DTG_ERROR("Client::connectedSlot: Socket is invalid!");
return;
}
if(state() != QAbstractSocket::ConnectedState)
{
DTG_ERROR("Client::connectedSlot: Socket not connected!");
return;
}
m_pTimer->start(500);
}
Verfasst: 4. Mai 2007 15:47
von nando
Ich hab es jetzt hinbekommen..
Man darf nicht aus dem slot die while schleife aufrufen und senden.
ich mach das jetzt so, dass ich, wenn ich connected bin einen QTimer starte.
und immer wenn der timer ablaeuft lese ich die naechste zeile aus der datei und sende diese....
ich glaub ich hab die event-verarbeitung blockiert....
jetzt funktioniert es wunderbar
Code: Alles auswählen
Client::Client(QObject *pParent) :
QTcpSocket(pParent),
m_serverPort(12111),
m_TestDataFileName("testdata_eddf.adexp"),
m_TestDataFile(m_TestDataFileName)
{
DTG_DEBUG("Client::Client:");
.
.
.
.
m_pTimer = new QTimer(this);
connect(m_pTimer, SIGNAL(timeout()), this, SLOT(timeoutSlot()));
}
void
Client::timeoutSlot()
{
DTG_DEBUG("Client::timeoutSlot:");
if( !m_in.atEnd()) {
m_line = m_in.readLine();
m_line.append("\n");
QTextStream out(this);
out << m_line.toAscii();
DTG_DEBUG("Sent line: " << m_line.toStdString());
}
else {
DTG_DEBUG("Client::timeoutSlot: All data sent -> closing file.");
m_TestDataFile.close();
}
}
bool
Client::start()
{
DTG_DEBUG("Client::start: ");
if(!m_TestDataFile.open(QIODevice::ReadOnly| QIODevice::Text)) {
DTG_ERROR("Client::Client: Couldn't open testdata file: " <<
m_TestDataFileName.toStdString());
return false;
}
m_in.setDevice(&m_TestDataFile);
QString ip("10.240.67.40");
DTG_DEBUG("Client::start: connecting to host: " << ip.toStdString() << ":" << m_serverPort);
connectToHost(QHostAddress(ip), m_serverPort);
DTG_DEBUG("Client::Client: testdata file: " <<
m_TestDataFileName.toStdString() << " opened succesfully.");
return true;
}
void
Client::connectedSlot()
{
DTG_DEBUG("Client::connectedSlot:");
if(!isValid()) {
DTG_ERROR("Client::connectedSlot: Socket is invalid!");
return;
}
if(state() != QAbstractSocket::ConnectedState)
{
DTG_ERROR("Client::connectedSlot: Socket not connected!");
return;
}
m_pTimer->start(500);
}