[GELÖST] TCP - empfange manchmal leere Pakete
Verfasst: 7. Februar 2013 19:40
Hallo,
Ich möchte eine Client-Server Kommunikation über TCP implementieren. Dabei erstellt der Server für jeden neuen Client einen eigenen Thread um mit ihm zu kommunizieren.
Verbindet sich ein Client mit dem Server, erhalte ich vom QTcpServer im Hauptthread einen Zeiger auf den QTcpSocket. Diesen übergebe ich an den jeweiligen Client-Thread über den Socketdeskriptor.
Innerhalb von run() des QThread:
Das Senden an den Client passiert weiterhin im Hauptthread über den Socket, den ich vom QTcpServer erhalten habe.
Der Client funktioniert ähnlich. Er nutzt auch einen Thread (Klasse TcpThread), der für die Tcp Kommunikation zuständig ist.
Innerhalb von run() des QThread:
Das Senden an den Server passiert hier ebenfalls im Hauptthread, wobei der Client via TcpThread::getSender() den Socket erhält.
Das Empfangen von Daten funktioniert sowohl beim Server, als auch beim Client schematisch folgendermaßen:
Sobald der Thread Daten vom Socket erhält, wird ein Signal gefeuert, um es dem Client bzw. Server mitzuteilen.
Die Threads sind sozusagen die meiste Zeit im wait Zustand und dafür zuständig, Daten zu empfangen.
Das funktioniert in den meisten Fällen wunderbar, jedoch nicht immer. Manchmal empfange ich leere Pakete (0 bytes).
Dies passiert in etwa 10-20% aller Fälle wenn ich vom Client zum Server sende.
Ich bin echt ratlos und weiß nicht, woran es liegen könnte. Es wird zwar etwas empfangen, jedoch nur "leere" Daten. Und das völlig willkürlich.
Ich wär Euch echt sehr dankbar, wenn ihr mir dabei helfen könnt.
Viele Grüße,
Daniel
Ich möchte eine Client-Server Kommunikation über TCP implementieren. Dabei erstellt der Server für jeden neuen Client einen eigenen Thread um mit ihm zu kommunizieren.
Verbindet sich ein Client mit dem Server, erhalte ich vom QTcpServer im Hauptthread einen Zeiger auf den QTcpSocket. Diesen übergebe ich an den jeweiligen Client-Thread über den Socketdeskriptor.
Innerhalb von run() des QThread:
Code: Alles auswählen
m_socket = new QTcpSocket();
m_socket->setSocketDescriptor(m_descriptor);Der Client funktioniert ähnlich. Er nutzt auch einen Thread (Klasse TcpThread), der für die Tcp Kommunikation zuständig ist.
Innerhalb von run() des QThread:
Code: Alles auswählen
m_socket = new QTcpSocket();
m_socket->connectToHost(m_hostName, m_port);Code: Alles auswählen
QTcpSocket* TcpThread::getSender()
{
if (m_sender==NULL)
{
m_sender = new QTcpSocket();
m_sender->setSocketDescriptor(m_socket->socketDescriptor());
}
return m_sender;
}Code: Alles auswählen
while (!m_error)
{
if (m_socket->waitForReadyRead())
{
QByteArray data = m_socket->readAll();
emit receive(data);
}
}Die Threads sind sozusagen die meiste Zeit im wait Zustand und dafür zuständig, Daten zu empfangen.
Das funktioniert in den meisten Fällen wunderbar, jedoch nicht immer. Manchmal empfange ich leere Pakete (0 bytes).
Dies passiert in etwa 10-20% aller Fälle wenn ich vom Client zum Server sende.
Ich bin echt ratlos und weiß nicht, woran es liegen könnte. Es wird zwar etwas empfangen, jedoch nur "leere" Daten. Und das völlig willkürlich.
Ich wär Euch echt sehr dankbar, wenn ihr mir dabei helfen könnt.
Viele Grüße,
Daniel