#include #include #include #define COLOR_BLACK 30 #define COLOR_RED 31 #define COLOR_GREEN 32 #define COLOR_YELLOW 33 #define COLOR_BLUE 34 #define COLOR_MAGENTA 35 #define COLOR_CYAN 36 #define COLOR_WHITE 37 #if 0 #define DELIMITER '\n' #define DELSTR "\n" #else #define DELIMITER '#' #define DELSTR "#" #endif // pole request..., aktualni pozice konce requestu char command_buffer[ 5000]; void resetColor() { printf("\x1b[0m"); } void print( int color, const char* data) { printf("\x1b[%dm%s", color, data); } void print( int color, const char* data, int length) { printf("\x1b[%dm%*.*s", color, length, length, data); } void printData( const char *data, int start_pos, int end_pos, int total_length ) { print(COLOR_WHITE, "DTA: "); if (start_pos) print(COLOR_BLUE, data, start_pos); print(COLOR_GREEN, data + start_pos, end_pos - start_pos); if (total_length != end_pos) { print(COLOR_RED, data + end_pos, 1); print(COLOR_CYAN, data + end_pos + 1, total_length - end_pos - 1); } else { print(COLOR_CYAN, data + end_pos, total_length - end_pos); } resetColor(); printf("\n"); } void printCommand( char *data, int pos) { print(COLOR_WHITE, "CMD: "); print(COLOR_BLUE, data, pos); print(COLOR_GREEN, data + pos, strlen(data) - pos); resetColor(); printf("\n"); } void processCommand( char* command){ print( COLOR_YELLOW, "FINAL COMMAND: "); print( COLOR_RED, command ); resetColor(); printf("\n"); } void processData( char *data, const int data_length) { int length = data_length; // data musí již být předem zakončena nulou printf("DATA: %s\n", data); for (char *current_ptr = data; length;) { char *delimiter_ptr = strchr(current_ptr, DELIMITER); const int command_buffer_length = strlen(command_buffer); if (delimiter_ptr) { // máme oddělovač - připojíme kus dat k sestavovanému příkazu... (na aktuální pozici) if (command_buffer_length + delimiter_ptr - current_ptr + 1 >= sizeof(command_buffer)) { print(COLOR_RED, "Fatal error - command buffer is too small"); exit(1); } strncat(command_buffer, current_ptr, delimiter_ptr - current_ptr); printData(data, current_ptr - data, delimiter_ptr - data, data_length); printCommand(command_buffer, command_buffer_length); processCommand(command_buffer); command_buffer[0] = '\x00'; // vyprázdníme sestavovaný příkaz // musíme zpracovat zbytek dat length -= delimiter_ptr - current_ptr + 1; // odečteme délku zpracovaných dat včetně oddělovače current_ptr = delimiter_ptr + 1; } else { //celý zbytek dat připojíme k sestavovanému příkazu if (command_buffer_length + strlen(current_ptr) + 1 >= sizeof(command_buffer)) { print(COLOR_RED, "Fatal error - command buffer is too small"); exit(1); } strcat(command_buffer, current_ptr); printData(data, current_ptr - data, data_length, data_length); printCommand(command_buffer, command_buffer_length); length = 0; // poslední blok dat byl zpracován } } } int main(int argc, char *argv[]) { char text[] = "time" DELSTR "strlen texticek dlouhy" DELSTR "strlen texticek wljvrwnvrenv" DELSTR "strlen texticek fkjrnfq" DELSTR "strlen texticek nvflkdnvl" DELSTR "strlen texticek uhreiugfr" DELSTR "strlen texticek fnvlkwnlkk" DELSTR "strlen texticek fhuliq" DELSTR "strlen texticek ufhrewqqqqqqqqqqqqq" DELSTR "strrev jtkrnblrebnetnby" DELSTR; int len = strlen(text); for (int pos = 0; pos < len;) { char buff[1000]; int rnd = rand() % 50; int tail = strlen(text + pos); if (rnd > tail) rnd = tail; strncpy(buff, text + pos, rnd); pos += rnd; int response_size = rnd; //recv(s, buff, sizeof(buff) - 1, 0); if (response_size < 0) { printf("error"); return 1; } else { buff[response_size] = '\x00'; processData(buff, response_size); } } return 0; }