Sziasztok!
Qt (4.3.4) segítségével írok egy kliens-szerver alkalmazást.
Két problémám merült fel, melyben a segítségeteket szeretném kérni.
Már több fórumon is átolvastam az erre vonatkozó témákat, de nem jutottam sokkal előbbre.
1. A klienstől érkező adatokat a szerver nem mindig fogadja.
A kliens sikeresen csatlakozik a szerverhez. Van amikor a szerver sikeresen fogadja az adatot, de legtöbbször nem. Wiresharkkal megnéztem, hogy mi történik, a kliens minden esetben elküldi az adatot.
Több kliens egy időben való párhuzamos kiszolgálása érdekében QThread-eket használok. Ha egy kliens csatlakozik, akkor létrejön neki egy thread, amely run metódusa a következő:
void ServerThread::run()
{
tcpSocket = new QTcpSocket();
if (!tcpSocket->setSocketDescriptor(socketDescriptor))
{
emit error(tcpSocket->error());
return;
}
connect(tcpSocket, SIGNAL(readyRead()), this, SLOT(recv()));
exec();
}
Amikor a fogadás nem történik meg, akkor a tcpSocket nem is küld readyRead() signalt, tehát nem a recv() fv-ben van a hiba.
Valakinek van tippje, hogy mi lehet a probléma oka? Arra sem sikerült rájönnöm, hogy mitől függ, hogy a server fogad adatot vagy nem.
2. A másik problémámat pedig a szálak okozzák.
A ServerThread osztálynak van egy send() metódusa, amelyben a tcpSocket write() metódusát hívom meg (a tcpSocket objektum a run()-ban lett létrehozva). Ekkor a következő üzenetet kapom: "QObject: Cannot create children for a parent that is in a different thread. (Parent is QNativeSocketEngine(0x8093530), parent's thread is ServerThread(0x808a280), current thread is QThread(0x8052740)"
Ez a probléma akkor van, ha a szerver küld a kliensnek. Erre mit tudtok javasolni? Azt nem tudtam megoldani, hogy egy szálon legyenek, mert GUI-s programról van szó, így valahol mindenképpen meg kell hívni egy másik szálbeli metódust.
Előre is köszönöm a válaszokat!