• Как перехватывать трафик сетевой карты?

    Rou1997
    @Rou1997
    "Трафик сетевой карты" - это не IP-пакеты и даже не Ethernet-кадры, а электрические импульсы в кабеле, или радиоволны! Между сетевой картой и Winsock (TCP) пролегает штук 5-10 слоев кода в ядре NT, это несколько системных драйверов, Pcap всего лишь еще один драйвер, он также загружается в ОЗУ в процесс System и в рамках этого процесса ставит "хуки" в один из ранее загруженных системных драйверов.
    Тем не менее, для HTTP даже такое решение как Pcap слишком низкоуровневое, как и сниффер Wireshark который на основан на Pcap. Смотрите лучше в сторону сниффера Fiddler и его библиотеки FiddlerCore, там просто локальный HTTP-прокси, который устанавливается в систему и отслеживает трафик, можете использовать эту библиотеку, там хотя бы C# а не C++, или сами такой прокси написать, не обязательно локальный.
    И в любом случае учтите что область мало проработана и нет гарантий что в интернете есть все необходимые примеры исходного кода и документация, поэтому надо мало того что уметь их искать и анализировать, может понадобится еще и анализ, реверс-инжиниринг самих снифферов - отладка, дизассемблирование, декомпиляция, опять же с Fiddler это намного проще поскольку .NET.
    Рассчитывать здесь на помощь на форуме, тем более бесплатную, это полнейший абсурд и наивность.
    Ответ написан
    Комментировать
  • Как исправить ошибку 'map итератор неразыменовываемый'?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    if ((!words.empty() && words.find(word) != words.end() && word_str != words.end()->first) || std::string(word) == words.end()->first)

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

    А проблема в words.end()->first.
    en.cppreference.com/w/cpp/container/map/end
    Итератор, возвращаемый end() не может быть разыменован.

    UPD:
    Задача, как я вижу, собеседовательная. У нее есть более простое и быстрое решение с меньшим количеством строк.
    Ответ написан
    4 комментария
  • Как реализовать частичную специализацию для указателя на определённый класс?

    @MarkusD Куратор тега C++
    все время мелю чепуху :)
    В общем, Антон Жилин все описал правильно, но есть еще один выход.

    Чтобы понять преимущество предлагаемого мной подхода, нужно обратиться к коду std::basic_string.
    Например, вот эта реализация.
    https://android.googlesource.com/platform/ndk/+/bf...

    Вторым параметром идут так называемые черты - traits для типа символов в строке. По своей сути функциональность std::string, std::wstring, std::u16string и std::u32string отличается только реализацией именно этого параметра.
    Сам шаблон черт для строки описан немногим выше 75й строки.
    Вся реализация std::basic_string полностью опирается на список статических функций из заданных в шаблоне черт.

    Я предлагаю вынести частную специализацию за пределы твоего шаблона List и определить черты ListTraits, которые уже и специализировать для нужных классов, в частности - для Storage_device.
    В черты можно и нужно выделять только важные функции. Это можно сравнить с вынужденной мерой.

    template< typename TDataType >
    class ListTraits
    {
    public:
    	// ...
    	
    	template< typename TNodeType >
    	inline static void AddHead( TNodeType node, TDataType data );
    	
    	// ...
    };
    
    template<>
    class ListTraits<Storage_device*>
    {
    public:
    	// ...
    	
    	template< typename TNodeType >
    	inline static void AddHead( TNodeType node, Storage_device* data );
    	
    	// ...
    };
    
    template< typename TNodeType, typename TDataType >
    class List
    {
    	// Тип используемых черт.
    	using Traits = ListTraits<TDataType>;
    	
    	TNodeType *head, *tail;
    	int count;
    
    public:
    	// ...
    	
    	void AddHead(TDataType data);
    	
    	// ...
    };
    
    template< typename TNodeType, typename TDataType >
    void List<TNodeType, TDataType>::AddHead( TDataType data )
    {
    	// ...
    	
    	Traits::template AddHead( temp, data );
    	
    	// ...
    };
    Ответ написан
    Комментировать
  • Как реализовать частичную специализацию для указателя на определённый класс?

    Так как вы хотите специализировать параметры шаблона класса, то придётся специализировать весь класс:

    template <typename Node, typename DataType>
    class List
    {
      Node *head, *tail;
      int count;
    
    public:
      // ...
      void AddHead(DataType data);
    };
    
    template <typename Node>
    class List<Node, Storage_device*>
    {
      using DataType = Storage_device*;
    
      Node *head, *tail;
      int count;
    
    public:
      // ...
      void AddHead(DataType data);
    };

    Теперь для этой специализации класса получится определить AddHead, как у вас.

    Можно обойтись без специализации всего класса, искусственно добавив шаблон в функцию:

    template<typename = std::enable_if<std::is_same<DataType, Storage_device*>>::type>
    void AddHead(DataType data);  // specialized version
    
    template<typename = std::enable_if<!std::is_same<DataType, Storage_device*>>::type>
    void AddHead(DataType data);  // general version

    Правда, я давно не использовал std::enable_if, не гарантирую, что это работает.

    template<typename Node, typename DataType>
    class List {
        //...
    public:
        template<typename = std::enable_if<std::is_same<DataType, Storage_device*>>::type>
        void AddHead(DataType data);
    
        template<typename = std::enable_if<!std::is_same<DataType, Storage_device*>>::type>
        void AddHead(DataType data);
    };
    
    template<typename Node, typename DataType>
    template<typename = std::enable_if<std::is_same<DataType, Storage_device*>>::type>
    void List<Node, DataType>::AddHead(DataType data);
    
    template<typename Node, typename DataType>
    template<typename = std::enable_if<!std::is_same<DataType, Storage_device*>>::type>
    void List<Node, DataType>::AddHead(DataType data);
    Ответ написан
    5 комментариев
  • Почему после преобразования ветки в бинарное дерево оно сразу же пропадает?

    15432
    @15432
    Системный программист ^_^
    Здесь вы создаёте новый Elem в локальной переменной 'to'
    to = new Elem;

    После выхода из функции этот указатель теряется, а исходный root не изменяется.

    Попробуйте передавать указатель по ссылке, например, так

    void Tree::Copy(const Elem* from, Elem* &to)
    Ответ написан
    1 комментарий
  • Как указать composer где находится файл php.ini?

    BuriK666
    @BuriK666
    Компьютерный псих
    php --help
    -c | Look for php.ini file in this directory

    php -c /path/to/php.ini composer.phar ...
    Ответ написан
    1 комментарий
  • Что способствует нарушению кучи?

    petermzg
    @petermzg
    Самый лучший программист
    Тут
    Path Path::operator + (const Path &pth) const
    {
       Path obj;
     
        int buff_size = strlen(this->path) + strlen(pth.path) + 1;
        obj.path = new char[buff_size]; // утекло то, что в конструкторе без параметров создано
        strcpy_s(obj.path, buff_size, this->path); // количество символов для копирования больше чем в this->path
        ...
    }
    Ответ написан
    8 комментариев
  • Почему проэкт вызывает точку останова?

    Очевидно, что куча повреждена. Скорее всего, из-за неаккуратной работы с динамической памятью (например, дважды вызван free для одного указателя)
    Ответ написан
    6 комментариев
  • Как использовать "гибкость" двумерного массива, перед одномерным?

    @Mercury13
    Программист на «си с крестами» и не только
    Итак, перед нами задача: сделать динамический массив «умных указателей единоличного владения». Умный указатель единоличного владения (std::unique_ptr из C++11) — это указатель, который самолично владеет выделенной памятью; при исчезновении указателя исчезает и память.

    Раз мы только учимся, мы не будем влезать в самописные шаблоны C++, готовые шаблоны STL (кроме algorithm и string) и новый, но уже реализованный во всех компиляторах стандарт C++11. Это довольно серьёзное ограничение; если его снять, можно серьёзно упростить себе жизнь. А для этого мы отделим структуру данных от жизненных объектов и реализуем объект StudentList. Пишу с листа, возможны ошибки.

    Да, и без C++11 умный указатель единоличного владения реализовать довольно тяжело — поэтому структуру данных будем делать «монолитно», без разделения на умный указатель и динамический массив.

    #include <algorithm>
    
    class StudentList
    {
    public:
      StudentList();
      ~StudentList();
      Student& add();   // добавить пустого студента и выдать ссылку на новенького
      size_t size() const { return fSize; }
      Student& operator[](size_t i) { return *fData[i]; }   // можно также наладить проверку диапазона — сделай это сам…
      const Student& operator[](size_t i) const { return *fData[i]; }
      void clear();
    private:
      typedef Student* PStudent;
      PStudent* fData;
      size_t fSize, fCapacity;   // реальное кол-во студентов и на сколько студентов у нас заведено памяти.
                            // Указатели [fSize..fCapacity) резервные, их значение не определено и высвобождать
                            // их не надо.
      enum { BLOCK_SIZE = 16; };
      StudentList(const StudentList&) {}   // копирование запрещаем, хочешь — реализуй сам и вынеси в public
      StudentList& operator=(const StudentList&) { return *this; }  // аналогично
    };
    
    StudentList::StudentList(); : fData(NULL), fSize(0), fCapacity(0) {}
    
    Student& StudentList::add()
    {
      // Убедиться, что массива хватает; если нет — расширить
      if (fSize >= fCapacity) {
        size_t newCapacity = fCapacity + BLOCK_SIZE;
        PStudent* newData = new PStudent[newCapacity];
        std::copy(fData, fData + fSize, newData);
        delete[] fData;
        fData = newData;
        fCapacity = newCapacity;
      }
      // Завести нового студента
      Student* r = new Student;
      fData[fSize++] = r;
      return *r;
    }
    
    void StudentList::clear()
    {
       for (size_t i = 0; i < fSize; ++i)
         delete fData[i];
       delete[] fData;
       fData = NULL;
       fSize = 0;
       fCapacity = 0;
    }
    
    StudentList::~StudentList()
    {
       clear();
    }


    Удаление и прочее сам наладишь?

    А группа будет пользоваться нашим списком.

    #include <string>
    
    class AcademyGroup
    {
    public:
       std::string name;
       StudentList students;  // при желании можно заинкапсулировать и его.
    };


    Это перед нами, правда, не двухмерный массив, как я уже сказал. Массив, хоть и Student**, но одномерный; каждый элемент массива — умный указатель единоличного владения. Если бы мы писали на STL C++11, это был бы std::vector<std::unique_ptr<Student>>.

    Кроме УУЕВ, существует также умный указатель совместного владения std::shared_ptr.

    Можно сделать второй вариант — массив из одномерных массивов. Если он заполнился — заводим ещё один массивчик. Пишется немного сложнее, особенно если не пользоваться STL. На STL — std::deque<Student>.
    Ответ написан
    6 комментариев
  • Как использовать "гибкость" двумерного массива, перед одномерным?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Здесь скорее всё-таки не двумерный массив, а одномерный массив содержащий указатели на экземпляры класса Student. Соответственно, при добавлении студента копируются не сами экземпляры, а только ссылки на них.
    Ответ написан
    Комментировать
  • Почему изменяются значения полей объекта структуры?

    @nirvimel
    Из getStudentData возвращается указатель на локальный объект student.
    Ответ написан
    3 комментария
  • Почему не удаётся записать символ в строку?

    petermzg
    @petermzg
    Самый лучший программист
    char * str1 = new char[6]; // тут вы выделяете 6 байт памяти
                                             // и присваиваете адрес выделенной памяти переменной str1
    str1 = "Lorem"; // тут вы теряет ранее полученный адрес (утечка памяти)
                            // и переменной str1 присваиваете новый адрес из (not write access) блока памяти.
    str1[5] = '\0';   // тут у вас уже проблема, так как на эту область памяти стоит защита от записи.

    Содержимое строки нужно копировать в выделенную память
    Ответ написан
    5 комментариев
  • Почему не удаётся записать символ в строку?

    Поехали .
    Char * str =бльбаблабла
    Тут во-первых и так на конце будет нуль.
    Если нет, значит в этой строке можно сразу нуль дописать.Врчд ли это будет нужно.
    Область памяти только для чтении.

    2. Гуглим сравнение строк и указателей
    3.т ам выделана память на чтение и запись
    А тут видимо выехали за границу. с мобилы плохо видно.
    4. Нужно использовать только safe варианты и прочитать иныу о параметрах. Сейчас не подскажу
    Ответ написан
    5 комментариев
  • Почему происходит пропуск функции считывания строки gets_s?

    @abcd0x00
    Вызов gets_s() проскакивает потому, что при вводе по cin ты нажимаешь Enter в конце. Когда нажимаешь Enter, в поток посылается символ перевода строки и остаётся там. А потом gets_s() видит его и считает введённой строкой. Поэтому ты должен после cin выполнить cin.get()

    Пример
    #include <iostream>
    
    using namespace std;
    
    int main()
    {
        int n;
        char c;
    
        cin >> n;
        cin.get(c);
    
        cout << n << " " << int(c) << endl;
        return 0;
    }


    Вывод
    [guest@localhost cpp]$ .iso++ t.cpp -o t
    [guest@localhost cpp]$ ./t
    123
    123 10
    [guest@localhost cpp]$


    Вот это число 10 - это код символа \n (символа перевода строки).
    Ответ написан
    Комментировать
  • Почему происходит пропуск функции считывания строки gets_s?

    @MiiNiPaa
    Главная проблема — смешивание форматированного и неформатированного ввода: stackoverflow.com/a/21567292/3410396

    И да, не мешайте С и С++. Используйте getline вместо gets_s
    Ответ написан
    2 комментария
  • Что за ошибка с памятью и как её решить?

    Rsa97
    @Rsa97
    Для правильного вопроса надо знать половину ответа
    Здесь надо выделять массив, а не переменную
    bool* nptr = new bool;
    В целом код еле-еле натягивает на троечку. Использование четырёх! стеков там, где можно обойтись двумя. Двойное копирование массивов в push, где можно обойтись одним, не говоря уже про realloc. Копирование массивов при pop, где оно совсем не нужно. Перевыделение памяти на каждый push/pop.
    Передача типа строкой вместо bool или enum.
    Ответ написан
    Комментировать
  • Как вынести фрагмент условия?

    maaGames
    @maaGames
    Погроммирую программы
    На самом деле данную проблему решают иначе. В шахматных числодробилках, как ив любых числодробилках, нужно стараться свести количество условий к минимуму. Вместо проверки выхода за границы матрицы (а это 4 проверки, либо две, если используются беззнаковые числа и переполнение), саму матрицу расширяют на единичку с каждой стороны и записывают туда флаговое или другое "блокирующее" значение.
    Хотя, у вас проверка условий начинается с проверки выхода за границы массива и проблемы с ошибкой не должно было быть изначально... если бы не перепутали порядок в двумерном массиве. На самом деле field[y][x].
    Ответ написан
    Комментировать
  • Как реализовать переключатель?

    @Caitiff_One
    Обычный человек, начинающий разработчик:)
    Попробуйте перед очищением консоли задавать стандартный черный цвет фона:)

    так - работает:
    void Select1Player()
    {	
      COORD coord = { 50, 10 };
      HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
      SetConsoleTextAttribute(hStdOut, 0);
      system("cls");
      SetConsoleTextAttribute(hStdOut,
        BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY | BACKGROUND_RED);
      SetConsoleCursorPosition(hStdOut, coord);
      cout << "1 PLAYER";
      
      coord.X = 50;
      coord.Y = 11;
      SetConsoleTextAttribute(hStdOut,
        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED);
      SetConsoleCursorPosition(hStdOut, coord);
      cout << "2 PLAYERS";
    }
    
    //выводит выбор параметров и выделяет "2 players"
    void Select2Players()
    {
      COORD coord = { 50, 10 };
      HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
      SetConsoleTextAttribute(hStdOut, 0);
      system("cls");
      SetConsoleTextAttribute(hStdOut,
        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED);
      SetConsoleCursorPosition(hStdOut, coord);
      cout << "1 PLAYER";
      
      coord.X = 50;
      coord.Y = 11;
      SetConsoleTextAttribute(hStdOut,
        BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY | BACKGROUND_RED);
      SetConsoleCursorPosition(hStdOut, coord);
      cout << "2 PLAYERS";
    }
    Ответ написан
    Комментировать
  • Как реализовать переключатель?

    @balamyt92
    ; select * from users; --
    #include <iostream>
    #include <windows.h>
    #include <conio.h>
    using namespace std;
    
    void Select1Player();
    void Select2Players();
    
    int main()
    {
      bool player2 = false;
      Select1Player();
    
      char c = 0;
      while(c != 13)
      {
        c = _getch();
        if((c == 72 || c == 80) && player2 == false)//38 и 40 - стрелки вверх и вниз у таблице ASCII
        {
          player2 = true;
          Select2Players();
        }
        else if(c == 72 || c == 80)
        {
          player2 = false;
          Select1Player();
        }
      }
      return 0;
    }
    
    //выводит выбор параметров и выделяет "1 player"
    void Select1Player()
    {
      COORD coord = { 50, 10 };
      static HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
      SetConsoleTextAttribute(hStdOut,
        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED);
      system("cls");
    
      SetConsoleCursorPosition(hStdOut, coord);
      SetConsoleTextAttribute(hStdOut,
        BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY | BACKGROUND_RED);
      cout << "1 PLAYER";
      SetConsoleTextAttribute(hStdOut,
        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED);
      coord = { 50, 11 };
      SetConsoleCursorPosition(hStdOut, coord);
      cout << "2 PLAYERS";
    }
    
    //выводит выбор параметров и выделяет "2 players"
    void Select2Players()
    {
       COORD coord = { 50, 10 };
      static HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
      SetConsoleTextAttribute(hStdOut,
        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED);
      system("cls");
    
      SetConsoleCursorPosition(hStdOut, coord);
      SetConsoleTextAttribute(hStdOut,
        FOREGROUND_GREEN | FOREGROUND_BLUE | FOREGROUND_INTENSITY | FOREGROUND_RED);
      cout << "1 PLAYER";
      SetConsoleTextAttribute(hStdOut,
        BACKGROUND_GREEN | BACKGROUND_BLUE | BACKGROUND_INTENSITY | BACKGROUND_RED);
      coord = { 50, 11 };
      SetConsoleCursorPosition(hStdOut, coord);
      cout << "2 PLAYERS";
    }
    Ответ написан
    6 комментариев