ich versuche derzeit eine Datenklasse via QDataStream über TCP/IP zu übertragen.
Das ganze hat bis eine Datenmenge von 65000 bis jetzt immer prima geklappt. Da meine Datenmenge
jetzt größer wurde, habe ich auf "qint32 Datenlänge erweitert."
Hier die Stream Operatoren dafür den *Pointer der verwendeten Klasse
Code: Alles auswählen
// *************************************************************
// Stream out operator
// *************************************************************
QDataStream& operator<<(QDataStream& stream, const DataBlock& data)
{
qint32 bytesToSend;
int BlockSize;
int BytesWritten=1;
char *pointer;
stream << data.getStorageTime()
<< data.getDescription()
<< data.getSize()
<< data.getUsedSize()
<< data.getNumber()
<< data.getSubNode()
<< (int) data.getType()
<< data.getQuality()
<< data.getCheckSum()
<< data.getCycleReadTime();
bytesToSend = data.getSize();
if( bytesToSend > 32760)
BlockSize=32760;
else
BlockSize=(int) bytesToSend;
pointer=data.getData();
while (bytesToSend > 0 && BytesWritten > 0)
{
BytesWritten=stream.writeRawData( pointer , BlockSize) ;
if( BytesWritten > 0 )
{
bytesToSend -= BytesWritten;
if( bytesToSend > 0 )
{
pointer +=BytesWritten;
if( bytesToSend > 32760)
BlockSize=32760;
else
BlockSize=(int) bytesToSend;
}
}
}
return stream;
}
// *************************************************************
// Stream in operator
// *************************************************************
QDataStream& operator>>(QDataStream& stream,DataBlock& data)
{
QDateTime Temp1;
QString Temp2;
int iTemp1;
int iTemp2;
int iTemp3;
qint32 UsedSize;
qint32 bytesToReceive=1;
int BlockSize;
int BytesReceived=1;
char *pointer;
stream >> Temp1 >> Temp2 >> bytesToReceive >> UsedSize >> iTemp1 >> iTemp2 >> iTemp3;
data.setStorageTime(Temp1);
data.setDescription(Temp2);
data.setSize(bytesToReceive);
data.setUsedSize(UsedSize);
data.setNumber(iTemp1);
data.setSubNode( iTemp2);
data.setType( (BlockDataType)iTemp3);
stream >> iTemp1 >> iTemp2 >> iTemp3;
data.setQuality(iTemp1);
data.setCheckSum( iTemp2 );
data.setCycleReadTime( iTemp3 );
if( bytesToReceive > 32760)
BlockSize=32760;
else
BlockSize=(int) bytesToReceive;
pointer=data.getData();
while (bytesToReceive > 0 && BytesReceived > 0 )
{
BytesReceived=stream.readRawData(pointer, BlockSize);
if( BytesReceived > 0)
{
pointer +=BytesReceived;
bytesToReceive -= BytesReceived;
if( bytesToReceive > 0 )
{
if( bytesToReceive > 32760)
BlockSize=32760;
else
BlockSize=(int) bytesToReceive;
}
}
}
return stream;
}
Code: Alles auswählen
out << *Pointer;
out << m_AccessPoint->getStatus();
LockPointer->unlock();
out.device()->seek(0); // jump back to the start of the block
out << (quint32)(m_block.size() - sizeof(quint32)); // write the size of data - size info into
Socket->write(m_block); // Send data to the Client
Socket->waitForBytesWritten(5000);
Hier der Empfangsteil:
( tcpSocket->bytesAvailable() ) gibt mir für den Datenteil immer nur 65532 als Max. verfügbare Daten.
Code: Alles auswählen
QDataStream in(tcpSocket); // Create a data stream by tcp/ip
in.setVersion(QDataStream::Qt_4_5); // we are using version 4.5
in >> blockSize;
while ( tcpSocket->bytesAvailable() < blockSize )
{
if ( tcpSocket->waitForReadyRead(65000) == false)
{
m_ActualAccess->setStatus(false); // Failure communication
m_LockPointer->unlock(); // Release lock of data block for other
delete tcpSocket; // Clean up the socket
return; // abort function
}
}
in >> *m_Pointer; // Get the object into the buffer
in >> UnitState; // get the state of the PLC
tcpSocket->disconnectFromHost(); // disconnect connection
m_ActualAccess->setStatus(UnitState); // Set the access point state
Code: Alles auswählen
quint32 blockSize;
QDataStream in(tcpSocket);
in.setVersion(QDataStream::Qt_4_5);
in >> blockSize;
while ( tcpSocket->bytesAvailable() < blockSize )
{
if ( tcpSocket->waitForReadyRead(65000) == false)
{
return;
}
}
in >> *m_Pointer;
in >> UnitState;
tcpSocket->disconnectFromHost();
Gruss R.