Проблема со сканированием точки доступа Wifi

Я использую команду iw для сканирования доступного SSID и соответствующего уровня сигнала с целью локализации внутри помещения. Однако точек доступа слишком много. Я могу попытаться обрезать список путем фильтрации SSID. Однако это постобработка, и она занимает некоторое время (1-2 секунды). Есть ли способ использовать iw с определенным SSID, чтобы получить уровень сигнала намного быстрее? Или есть какая-нибудь библиотека, которую я могу использовать для написания настроенного сканера для определенного SSID?

Большое спасибо!

1
задан 16 April 2019 в 17:43

7 ответов

std::endl функция и std::cout использует его путем реализации operator<< взять указатель функции с той же подписью как std::endl.

Там, это вызывает функцию и вперед возвращаемое значение.

Вот пример кода:

#include <iostream>

struct MyStream
{
    template <typename T>
    MyStream& operator<<(const T& x)
    {
        std::cout << x;

        return *this;
    }


    // function that takes a custom stream, and returns it
    typedef MyStream& (*MyStreamManipulator)(MyStream&);

    // take in a function with the custom signature
    MyStream& operator<<(MyStreamManipulator manip)
    {
        // call the function, and return it's value
        return manip(*this);
    }

    // define the custom endl for this stream.
    // note how it matches the `MyStreamManipulator`
    // function signature
    static MyStream& endl(MyStream& stream)
    {
        // print a new line
        std::cout << std::endl;

        // do other stuff with the stream
        // std::cout, for example, will flush the stream
        stream << "Called MyStream::endl!" << std::endl;

        return stream;
    }

    // this is the type of std::cout
    typedef std::basic_ostream<char, std::char_traits<char> > CoutType;

    // this is the function signature of std::endl
    typedef CoutType& (*StandardEndLine)(CoutType&);

    // define an operator<< to take in std::endl
    MyStream& operator<<(StandardEndLine manip)
    {
        // call the function, but we cannot return it's value
        manip(std::cout);

        return *this;
    }
};

int main(void)
{
    MyStream stream;

    stream << 10 << " faces.";
    stream << MyStream::endl;
    stream << std::endl;

    return 0;
}

Надо надеяться, это дает Вам лучшее представление о том, как эти вещи работают.

80
ответ дан 1 November 2019 в 06:01

Я бы порекомендовал использовать комплект Aircrack. Из этого набора вы можете использовать airodump-ng. Это пример:

Давайте отфильтруем по SSID DummyWifi :

airodump-ng --essid DummyWifi wlan0

И wlan0 - это имя вашего адаптера WiFi.

0
ответ дан 16 April 2019 в 17:43

Проблема - это std::endl шаблон функции, как Ваш оператор << . Таким образом, когда Вы пишете:

my_stream << endl;

Вам понравится, когда компилятор выводит шаблонные параметры для оператора, а также для endl. Это не возможно.

Таким образом, необходимо записать дополнительный, не обрабатывают по шаблону, перегрузки оператора << работать с манипуляторами. Их прототип будет похож:

UIStream& operator<<(UIStream& os, std::ostream& (*pf)(std::ostream&));

(существует два других, заменяя std::ostream std::basic_ios<char> и std::ios_base, который необходимо также обеспечить, если Вы хотите позволить всем манипуляторам), и их реализация будет очень похожа на тот из Ваших шаблонов. На самом деле, столь подобный, что можно использовать шаблон для реализации как это:

typedef std::ostream& (*ostream_manipulator)(std::ostream&);
UIStream& operator<<(UIStream& os, ostream_manipulator pf)
{
   return operator<< <ostream_manipulator> (os, pf);
}

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

36
ответ дан 1 November 2019 в 06:01

Посмотрите здесь для лучших способов расширить IOStreams. (Немного устаревший, и адаптированный для VC 6, таким образом, необходимо будет взять его с мелкой частицей соли),

Дело в том, что заставить функторы работать (и endl, который и выводы "\n" и сбросы является функтором), необходимо реализовать полный интерфейс ostream.

4
ответ дан 1 November 2019 в 06:01

std потоки не разработаны, чтобы быть разделенными на подклассы, поскольку у них нет виртуальных методов, таким образом, я не думаю, что Вы станете слишком далекими с этим. Можно попытаться агрегировать станд.:: ostream, чтобы сделать работу все же.

Сделать endl работайте необходимо реализовать версию operator<< это берет указатель на функцию в качестве именно так манипуляторы такой как endl обрабатываются т.е.

UStream& operator<<( UStream&, UStream& (*f)( UStream& ) );

или

UStream& UStream::operator<<( UStream& (*f)( UStream& ) );

Теперь std::endl функция, которая берет и возвращает ссылку на станд.:: basic_ostream так, чтобы не работал непосредственно с Вашим потоком, таким образом, необходимо будет сделать собственную версию, которая звонит до std::endl версия в Вашем агрегированном std::iostream.

Править: Взглядам нравится ответ GMAN, лучше. Он добирается std::endl работа также!

3
ответ дан 1 November 2019 в 06:01

Я сделал это для решения моей проблемы, вот часть моего кода:

    template<typename T> 
    CFileLogger &operator <<(const T value)
    {
        (*this).logFile << value;
        return *this;
    }
    CFileLogger &operator <<(std::ostream& (*os)(std::ostream&))
    {
        (*this).logFile << os;
        return *this;
    }

Main.cpp

int main(){

    CFileLogger log();    
    log << "[WARNINGS] " << 10 << std::endl;
    log << "[ERRORS] " << 2 << std::endl;
    ...
}

я вложил ссылку здесь http://www.cplusplus.com/forum/general/49590/

Hope, это может помочь кому-то.

7
ответ дан 1 November 2019 в 16:01

В дополнение к принятому ответу с C++ 11 возможно перегрузиться operator<< для типа:

decltype(std::endl<char, std::char_traits<char>>)
1
ответ дан 1 November 2019 в 16:01

Другие вопросы по тегам:

Похожие вопросы: