Динамические статические структуры )))

Тема в разделе "LANGS.C", создана пользователем gloomyraven, 27 апр 2010.

  1. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    qqwe
    с такой структурой будет как минимум неудобно работать. А как же поля местами менять автоматом? для каждого поля придется делать свой дефайн, учитывать размер поля и шаффлить (переставлять рандомно), так?
     
  2. Black_mirror

    Black_mirror Active Member

    Публикаций:
    0
    Регистрация:
    14 окт 2002
    Сообщения:
    1.035
    gloomyraven
    А какой смысл постоянно менять протокол между клиентом и сервером? Или у вас с каждой новой версией сервера нужно обновлять всех клиентов? Если протокол нужно защитить от чужих глаз, то можно просто шифровать. Если же нужна защита от нечестного клиента, то либо всё расчитывать на сервере, либо громоздкие расчёты произведённые на стороне клиента отсылать для проверки нескольким случайно выбранным другим клиентам. Кстати даже шифрование некоторого значения не поможет его спрятать, ведь еще остатся поиск по принципу "изменилось/не изменилось". Ключ для шифрования значения должен динамически меняться, а само значение перемещаться в памяти, тогда его найти будет существенно сложнее.
     
  3. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Black_mirror
    именно так
    само собой - сжатие + ssl
    да, но если протокол меняется раз в неделю, скажем, то кому-то придется раз в неделю заново исследовать протокол
    я хочу сделать, чтобы не в памяти перемещалось, а в самом протоколе: в один день идут данные "111222333", в другой те же данный идут 121123323, и это должен понимать как сервер, так и клиент, вот в чем смысл.
     
  4. Booster

    Booster New Member

    Публикаций:
    0
    Регистрация:
    26 ноя 2004
    Сообщения:
    4.860
    gloomyraven
    Плюс генерилки в том, что у вас генерируется код без макробесия, что очень хорошо. Макробесием это сделать можно, но получится не красиво и не удобно.
     
  5. gloomyraven

    gloomyraven Руслан

    Публикаций:
    0
    Регистрация:
    16 апр 2006
    Сообщения:
    288
    Адрес:
    Москва
    Кому интересно накидал небольшой код (конечно он занял бы строчек 10 на Руби и по времени во столько же раз меньше, но всё же сделал на с++), который берет файл main.txt и переставляет местами члены структур, может код и бажный, но тестовая версия работает.
    Код (Text):
    1. #include <Windows.h>
    2. #include <stdio.h>
    3. #include <algorithm>
    4. #include <numeric>
    5. #include <vector>
    6. #include <iterator>
    7.  
    8. #pragma comment(linker, "/ENTRY:main")
    9.  
    10. #define MAX_STRLEN 1024
    11.  
    12. void main()
    13. {
    14.     FILE *hFile = NULL;
    15.     bool isEOF;
    16.     int lscope=0, rscope=0; // количество левых и правых скобок {}
    17.     std::vector< std::string > v;
    18.     std::vector<unsigned int> vv;
    19.     char rline[MAX_STRLEN];
    20.     fpos_t start_pos, end_pos;
    21.  
    22.     hFile = fopen("main.txt", "r+");
    23.     if (hFile)
    24.     {
    25.         int state = 0;
    26.         int next_state = 1;
    27.         loop:
    28.         switch (state)
    29.         {
    30.         case 0: // очередную читаем строку
    31.             {
    32.                 memset(rline, 0, sizeof(rline));
    33.                 fgets(rline, MAX_STRLEN, hFile);
    34.                 isEOF = feof(hFile);
    35.                 if (ferror(hFile))
    36.                     break;
    37.                 else
    38.                     {state = next_state;}
    39.                 goto loop;
    40.             }
    41.         case 1: // проверяем строку на начало объявления структуры
    42.             {
    43.                 // если объявлена структура, заносим с список члены структыры
    44.                 if (NULL != strstr(rline, "typedef struct"))
    45.                 {
    46.                     lscope++;
    47.                     fgetpos(hFile, &start_pos); // сохраняем позицию в файле после "{"
    48.                     state = 0; next_state = 2;
    49.                 }
    50.                 else
    51.                 {
    52.                     if (isEOF) break;
    53.                     state = 0; next_state = 1;
    54.                 }
    55.                 goto loop;
    56.             }
    57.         // обработка структуры
    58.         case 2:
    59.             {
    60.                 state = 0, next_state = 2;
    61.                 if (strstr(rline, "{"))
    62.                     lscope++;
    63.                 if (strstr(rline, "}"))
    64.                     rscope++;
    65.                
    66.                 //если дошли до конца структуры (проверяем количество открывающих и закрывающих
    67.                 //скобок)
    68.                 if (rscope == lscope)
    69.                 {
    70.                     // сохраняем позицию после "}", чтобы можно было продолжить парсинг
    71.                     fgetpos(hFile, &end_pos);
    72.                     // устанавливаем позицию после "typedef.." и "{"
    73.                     fsetpos(hFile, &start_pos);
    74.  
    75.                     // создаем вектор из чисел 0..n-1 (n-число элементов в структуре)
    76.                     for(unsigned int i = 0; i < v.size(); i++)
    77.                         vv.push_back(i);
    78.  
    79.                     // шафлим числа в созданном вектре
    80.                     std::random_shuffle( vv.begin(), vv.end() );
    81.  
    82.                     // теперь записываем поля структуры в порядке, который указан
    83.                     // в шаввленном вектре vv
    84.                     for(unsigned int i = 0; i < v.size(); i++)
    85.                     {
    86.                         fputs(v[vv[i]].c_str(), hFile);
    87.                     }
    88.  
    89.                     if (isEOF) break;
    90.  
    91.                     lscope = 0;
    92.                     rscope = 0;
    93.                     v.clear();
    94.                     vv.clear();
    95.                     fsetpos(hFile, &end_pos);   // восстанавливаем позицию в файле
    96.                     state = 0, next_state = 1;
    97.                     goto loop;
    98.                 }
    99.                 //else goto loop;
    100.  
    101.                 // иначе записываем в вектор поле структуры
    102.                 if (lscope>0) v.push_back(rline);
    103.                 goto loop;
    104.             }
    105.         }
    106.     }
    107.    
    108.     fclose(hFile);
    109.  
    110.     ExitProcess(0);
    111. }
    Ну это так, шалости конечно...