2015-05-20 5 views
0

У меня есть некоторые проблемы с реализацией существующего протокола на C, особенно с созданием пакетов данных.синтаксический анализ и отправка данных в C

пакетных выглядит следующим образом:

HeaderData 1 (1 байт) | HeaderData 2 (1 байт) | Length_Data (2 байт) | Данные (переменной длины)

Я получаю некоторые данные через последовательный порт, и он сохраняется в ReturnMessage:

int getMessage(char * returnMessage){ 
int length = 0; 
//static char replay[REPLAY_MAX_SIZE]; 
memset(replay, 0x00, REPLAY_MAX_SIZE); 
// goes into the while-loop, if some data comes in 
// after a timeout of 20 seconds the program will be terminated 
if(select(fd +1 , &set, NULL, NULL, &timeout)){ 
    length = read(fd, returnMessage, REPLAY_MAX_SIZE); 
    //reinitialize fd_set values 
    FD_ZERO(&set); 
    FD_SET(fd, &set); 
    return length; 
    } 
    //printf("[%s] ERROR CANNOT GET MESSAGE\n", __FUNCTION__); 
return -1; 
} 

Эти данные в ReturnMessage я увеличит к моему пакету, чтобы отправить его дальше. Но я не знаю, как это сделать.

Возможно, есть способ с structs?

struct Packet{ 
    char header1[1]; 
    char header2[2]; 
    char lengthData[20]; 
    char data[MAX_DATA_LENGTH]; 
}; 

struct Packet packet; 

Но как я могу скопировать данные в returnMessage в пакет.data []? И как я могу конкатенировать данные в структуре, чтобы отправить пакет.

Есть ли у кого-нибудь представление о создании/анализе пакетов для простых протоколов?

Спасибо большое,

Флориан

+0

'memcpy()'? это не имеет ничего общего с «протоколами» и т. д. –

ответ

0

Предполагая, что вы получите полный пакет в вашем полукокса буфере (*), потом просто:

struct Packet{ 
    char header1[1]; 
    char header2[2]; 
    short lengthData; 
    char data[MAX_DATA_LENGTH]; 
}; 

void buftopacket(char *buffer, Packet *pkt) { 
    pkt->header1 = buffer[0]; 
    pkt->header2 = buffer[1]; 
    pkt->lengthData = buffer[2] << 8 + buffer[3]; /* assuming network order */ 
    memcpy(pkt->data, buffer + 4, (pkt->lengthData <= MAX_DATA_LENGTH) 
     ? pkt->lengthData : MAX_DATA_LENGTH); /* do not write pass buffer end*/ 
} 

(*), но ничего не гарантирует, что вы получаете полный пакет в одном про ...

Смежные вопросы