Hi,
I got the following code:
Client Send()
|
Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
|
else if(m_Status == SYNC || m_Status == START)
{
if(identifier == "event")
{
//Send identifier to let the client know what is being send
clientSocket->writeBlock((char*) &identifierLength, sizeof(identifierLength));
clientSocket->writeBlock(const_cast<char*>(identifier.data()), identifierLength);
qDebug("CLIENT<%d>: Sending Event: comp<%d> elem<%d> event<%d> name<%s>", m_Status, event.componentID, event.elementID, event.eventID, event.name.data());
clientSocket->writeBlock((char*) &event.elementID, sizeof(event.elementID));
clientSocket->writeBlock((char*) &event.eventID, sizeof(event.eventID));
clientSocket->writeBlock((char*) &event.componentID, sizeof(event.componentID));
//send events name
clientSocket->writeBlock((char*) &eventNameLength, sizeof(eventNameLength));
if( eventNameLength > 1 )
{
clientSocket->writeBlock(const_cast<char*>(eventName.data()), eventNameLength);
}
//check size before sending parameter
clientSocket->writeBlock((char*) ¶meterLength, sizeof(parameterLength) );
if( parameterLength > 1 )
{
clientSocket->writeBlock(const_cast<char*>(event.parameter.data()), parameterLength);
}
//send value list
clientSocket->writeBlock((char*)&valuesLength,sizeof(valuesLength));
if( valuesLength > 1)
{
for(int i=0; i<valuesLength; i++)
{
clientSocket->writeBlock((char*)&event.values[i],sizeof(event.values[i]));
}
}
clientSocket->flush();
}
}
|
the server accepts it like this:
|
Source code
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
else if(identifier == "event")
{
ReadStateEvent current = READ_ELEMENTID;
socket->readBlock((char*) &elementID, sizeof(elementID));
socket->readBlock((char*) &eventID, sizeof(eventID));
socket->readBlock((char*) &componentID, sizeof(componentID));
socket->readBlock((char*) &eventNamelength, sizeof(eventNamelength));
if(eventNamelength > 1)
eventName = convertStreamToString(socket, eventNamelength);
qDebug("SERVER<%d>: Name is <%s>", m_Status, eventName.data());
//check size before reading valuelist
socket->readBlock((char*) ¶meterlength, sizeof(parameterlength));
if(parameterlength > 1)
parameter = convertStreamToString(socket, parameterlength);
//check size before reading values
socket->readBlock((char*) &valuesLength, valuesLength);
if(valuesLength > 1)
{
int value;
for(int x=0;x<valuesLength;x++)
{
socket->readBlock((char*)&value,sizeof(value));
values.push_front(value);
}
}
qDebug("SERVER: Event received: comp<%d> elem<%d> event<%d> name<%s>", componentID, elementID, eventID, eventName.data());
//Send event to MMIManager
MMIEvent event( componentID, elementID, eventID, values, parameter, eventName);
MMIManager::getMMIObject()->delegateEvent( event );
}
|
I send an identifier to let the recipient know what is coming. The problem is, when a package arrives with more than one event, it crashes or reads only the first event. When the sender sends another package, the recipient reads the remaining events from the package before!
I tried to work with QSocket's bytesAvailable() and waitForMore(), but that ends up in an infinite loop.
Any hints, tricks, critic ?
Many thanks in advance.
Regards
Tom