Ich dachte erstmal allgemein zu diekutiren. Es ist ja auch nur auf dem einen Rechner reproduzierbar. Aber okay, hier der Server-Code zum schicken und empfangen:
Code: Alles auswählen
void LDCSProtocol::startWork() {
connect(socket, SIGNAL(readyRead()) , this, SLOT(readyRead()));
connect(socket, SIGNAL(disconnected()) , this, SLOT(disconnected()));
connect(socket, SIGNAL(destroyed(QObject*)), this, SIGNAL(ended()));
readData.clear(); // Als Klassen-Member definiertes QByteArray
}
void LDCSProtocol::readyRead() {
readData.append(socket->readAll());
log->log(QThread::currentThread()->objectName()+": LDCS-Data read. Size: "+QString().setNum(readData.size()),6);
log->log(QThread::currentThread()->objectName()+": Content: "+QString().append(readData.toHex()),6);
if (readData.size() >= 64) {
ldcsIn.setComplete(readData);
if (readData.size() == ldcsIn.getHeaderError()+ldcsIn.getHeaderDataSize()+64) {
readData.clear();
process();
}
}
}
void LDCSProtocol::disconnected() {
socket->flush();
socket->close();
socket->deleteLater();
}
void LDCSProtocol::process() {
QString job(VCAClass::getVCATag(ldcsIn.getData(),"JOB"));
QByteArray ldcsOut;
switch(ldcsIn.getHeaderCommand()) {
case 1001:
ldcsOut = QByteArray().append("Antwort");
break;
case 1008:
ldcsOut = QByteArray().append("Antwort");
break;
case 1009:
ldcsOut = QByteArray().append("Antwort");
break;
}
socket->write(ldcsOut);
socket->flush();
}
Das logging im readyRead-Slot wird dann im Fall das er hängen bleibt nicht mehr ausgeführt. Es liegt also nicht an fehlerhaften Daten.
Und hier der Client-Teil:
Code: Alles auswählen
void ConnectionTest::startWork() {
socket = new QTcpSocket(this);
log->log(name+": Start Work", 6);
connect(socket, SIGNAL(connected()), this, SLOT(connected()));
connect(socket, SIGNAL(disconnected()), socket, SLOT(deleteLater()));
connect(socket, SIGNAL(destroyed()) , this , SIGNAL(ended()));
socket->connectToHost("localhost"), 36001, QIODevice::ReadWrite);
}
void ConnectionTest::connected() {
QString locAdr(socket->localAddress().toString()+":"+QString().setNum(socket->localPort()));
QString remAdr(socket->peerAddress().toString()+":"+QString().setNum(socket->peerPort()));
log->log(name+": Connected: local: "+locAdr+" Remote: "+remAdr, 6);
QByteArray cmd(QByteArray::fromHex("00000000e9030000010000000000000000000000000000000100000001000000010000000c0000000000000000000000000000000000000000000000000000004a4f423d3534343737340d0a"));
disconnect(socket, SIGNAL(connected()), this, SLOT(connected()));
connect(socket, SIGNAL(readyRead()), this, SLOT(readyRead()));
socket->write(cmd);
socket->flush();
}
void ConnectionTest::readyRead() {
readData.append(socket->readAll());
log->log(name+": Read Data. Size: "+QString().setNum(readData.size()), 6);
if (readData.size() >= 64) {
ldcsIn.setComplete(readData);
if (readData.size() == ldcsIn.getHeaderError()+ldcsIn.getHeaderDataSize()+64) {
readData.clear();
process();
}
}
}
void ConnectionTest::process() {
LDCS ldcsOut;
switch(ldcsIn.getHeaderCommand()) {
case 1001:
ldcsOut.setComplete(QByteArray::fromHex("00000000f003000001000000000000000000000000000000010000000100000001000000170000000000000000000000000000000000000000000000000000004a4f423d303030303030353434373734302e5344460d0a"));
socket->write(ldcsOut.getComplete());
socket->flush();
log->log(name+": LDCS-Answer. Size: "+QString().setNum(ldcsOut.getComplete().size()),6);
break;
case 1008:
ldcsOut.setComplete(QByteArray::fromHex("00000000f103000001000000000000000000000000000000010000000100000001000000170000000000000000000000000000000000000000000000000000004a4f423d303030303030353434373734312e5344460d0a"));
socket->write(ldcsOut.getComplete());
socket->flush();
log->log(name+": LDCS-Answer. Size: "+QString().setNum(ldcsOut.getComplete().size()),6);
break;
case 1009:
socket->flush();
socket->close();
socket->disconnectFromHost();
break;
}
}
Und viel Glück das Deine Kugel gute gewartet wird
