Socket buffer processing, start repeating data and get lost
Hello guys
I'm having difficulty in a routine that will receive data via Socket and Send to a CAN interface.
My routine identifies a Bytes sequence, separates 13 bytes and processes, however some part of the code causes it to sometimes process the same buffer twice, I could not identify where ...
Code:
//Receive a message from client
while( (readSize = recv(sock , mensagemRecebida , TAM_BUFFER_RX_SOCKET , 0)) > 0 )
{
for(contador=0; contador<readSize; contador++)
args.arg1Dados[contador] = mensagemRecebida[contador];
args.arg2readSize = readSize;
if(pthread_create( &thread_Processar , NULL , &ProcessarDadosRecebidos , (void *)&args) < 0)
{
perror("could not create thread");
return 1;
}
//clear the message buffer
memset(mensagemRecebida, 0, TAM_BUFFER_RX_SOCKET);
}
Code:
struct arg_struct {
unsigned char arg1Dados[TAM_BUFFER_RX_SOCKET];
int arg2readSize;
};
void *ProcessarDadosRecebidos(void *arguments)
{
int idxNovoPacote=0;
int idxPosicaoInicioCAN = 0;
int idxPosicaoCharPacoteLido=0;
int ID_DESTINO_BT1 = 0;
int ID_DESTINO_BT2 = 0;
int DATASIZE = 0;
int ID_ORIGEM = 0;
int IDX_DEVICE = 0;
int IDX_FUNCAO_DEVICE = 0;
struct arg_struct *args = arguments;
unsigned char mensagemCANSeparada [DEFAULT_PACKET_CAN_SIZE];
for(idxPosicaoCharPacoteLido=0; idxPosicaoCharPacoteLido<args->arg2readSize; idxPosicaoCharPacoteLido++)
{
if (idxPosicaoCharPacoteLido + 7 < args->arg2readSize)
{
ID_DESTINO_BT1 = idxPosicaoCharPacoteLido;
ID_DESTINO_BT2 = idxPosicaoCharPacoteLido + 1;
DATASIZE = idxPosicaoCharPacoteLido + 4;
ID_ORIGEM = idxPosicaoCharPacoteLido + 5;
IDX_DEVICE = idxPosicaoCharPacoteLido + 6;
IDX_FUNCAO_DEVICE = idxPosicaoCharPacoteLido + 7;
if (args->arg1Dados[ID_DESTINO_BT1] == 0)
{
if (args->arg1Dados[ID_DESTINO_BT2] == 0)
{
if (args->arg1Dados[DATASIZE] == 8)
{
if (args->arg1Dados[ID_ORIGEM] == 0)
{
if (args->arg1Dados[IDX_DEVICE] > 0)
{
if (args->arg1Dados[IDX_FUNCAO_DEVICE] > 0)
{
idxPosicaoInicioCAN = idxPosicaoCharPacoteLido;
printf("Packet SEQ: %d Start Idx Of Packet %d Total Size: %d", contadorDebug, idxPosicaoInicioCAN, args->arg2readSize);
for(idxNovoPacote=0; idxNovoPacote<DEFAULT_PACKET_CAN_SIZE && idxNovoPacote<args->arg2readSize; idxNovoPacote++)
{
if(idxPosicaoInicioCAN < args->arg2readSize)
{
mensagemCANSeparada[idxNovoPacote] = args->arg1Dados[idxPosicaoInicioCAN];
idxPosicaoInicioCAN++;
}
else
printf("Tentativa de acessar indíce %d maior que a leitura de dados %d", idxPosicaoInicioCAN, args->arg2readSize);
}
printf(" Last Byte: %d\n", mensagemCANSeparada[idxNovoPacote - 1]);
idxPosicaoCharPacoteLido = idxPosicaoInicioCAN - 1;
contadorDebug++;
WriteCAN(mensagemCANSeparada, DEFAULT_PACKET_CAN_SIZE);
}
}
}
}
}
}
}
}
idxPosicaoInicioCAN = 0;
// TODO - TRATAR SOBRAS DE PACOTES
return NULL;
}
Test Send Data (Last byte is Sequential)
Quote:
Seq[0] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 0
Seq[1] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 1
Seq[2] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 2
Seq[3] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 3
Seq[4] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 4
Seq[5] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 5
Seq[6] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 6
Seq[7] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 7
Seq[8] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 8
Seq[9] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 9
Seq[10] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 10
Aguardando...10
Seq[11] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 11
Seq[12] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 12
Seq[13] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 13
Seq[14] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 14
Seq[15] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 15
Seq[16] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 16
Seq[17] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 17
Seq[18] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 18
Seq[19] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 19
Seq[20] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 20
Seq[21] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 21
Aguardando...21
Seq[22] Send Bytes : 0 0 0 1 8 0 1 2 1 2 3 4 22
Log Output (Last byte should be Sequencial)
Quote:
MapCANFrameToCharAndSend: Enviando dados CAN para SOCKET ID: 0 Size: 5
Packet SEQ: 0 Start Idx Of Packet 0 Total Size: 13 Last Byte: 0
Packet SEQ: 1 Start Idx Of Packet 13 Total Size: 130 Last Byte: 2
Packet SEQ: 2 Start Idx Of Packet 26 Total Size: 130 Last Byte: 3
Packet SEQ: 3 Start Idx Of Packet 39 Total Size: 130 Last Byte: 4
Packet SEQ: 4 Start Idx Of Packet 52 Total Size: 130 Last Byte: 5
Packet SEQ: 5 Start Idx Of Packet 65 Total Size: 130 Last Byte: 6
Packet SEQ: 6 Start Idx Of Packet 78 Total Size: 130 Last Byte: 7
Packet SEQ: 7 Start Idx Of Packet 91 Total Size: 130 Last Byte: 8
Packet SEQ: 8 Start Idx Of Packet 104 Total Size: 130 Last Byte: 9
Packet SEQ: 9 Start Idx Of Packet 117 Total Size: 130 Last Byte: 10
START REPEAT DATA Received:
Packet SEQ: 10 Start Idx Of Packet 0 Total Size: 130 Last Byte: 1
Packet SEQ: 11 Start Idx Of Packet 13 Total Size: 130 Last Byte: 2
Packet SEQ: 12 Start Idx Of Packet 26 Total Size: 130 Last Byte: 3
Packet SEQ: 13 Start Idx Of Packet 39 Total Size: 130 Last Byte: 4
Packet SEQ: 14 Start Idx Of Packet 52 Total Size: 130 Last Byte: 5
Packet SEQ: 15 Start Idx Of Packet 65 Total Size: 130 Last Byte: 6
Packet SEQ: 16 Start Idx Of Packet 78 Total Size: 130 Last Byte: 7
Packet SEQ: 17 Start Idx Of Packet 91 Total Size: 130 Last Byte: 8
Packet SEQ: 18 Start Idx Of Packet 104 Total Size: 130 Last Byte: 9
Packet SEQ: 19 Start Idx Of Packet 117 Total Size: 130 Last Byte: 10
Packet SEQ: 20 Start Idx Of Packet 0 Total Size: 13 Last Byte: 12
Packet SEQ: 20 Start Idx Of Packet 0 Total Size: 13 Last Byte: 12
Packet SEQ: 22 Start Idx Of Packet 0 Total Size: 13 Last Byte: 13
Packet SEQ: 23 Start Idx Of Packet 13 Total Size: 104 Last Byte: 15
Packet SEQ: 24 Start Idx Of Packet 26 Total Size: 104 Last Byte: 16
Packet SEQ: 25 Start Idx Of Packet 39 Total Size: 104 Last Byte: 17