Я использую команду iw
для сканирования доступного SSID и соответствующего уровня сигнала с целью локализации внутри помещения. Однако точек доступа слишком много. Я могу попытаться обрезать список путем фильтрации SSID. Однако это постобработка, и она занимает некоторое время (1-2 секунды). Есть ли способ использовать iw
с определенным SSID, чтобы получить уровень сигнала намного быстрее? Или есть какая-нибудь библиотека, которую я могу использовать для написания настроенного сканера для определенного SSID?
Большое спасибо!
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;
}
Надо надеяться, это дает Вам лучшее представление о том, как эти вещи работают.
Я бы порекомендовал использовать комплект Aircrack. Из этого набора вы можете использовать airodump-ng. Это пример:
Давайте отфильтруем по SSID DummyWifi :
airodump-ng --essid DummyWifi wlan0
И wlan0 - это имя вашего адаптера WiFi.
Проблема - это 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
часто лучший способ достигнуть того, что одну попытку достигнуть применения к технике Вы используете.
Посмотрите здесь для лучших способов расширить IOStreams. (Немного устаревший, и адаптированный для VC 6, таким образом, необходимо будет взять его с мелкой частицей соли),
Дело в том, что заставить функторы работать (и endl, который и выводы "\n" и сбросы является функтором), необходимо реализовать полный интерфейс ostream.
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
работа также!
Я сделал это для решения моей проблемы, вот часть моего кода:
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, это может помочь кому-то.
В дополнение к принятому ответу с C++ 11 возможно перегрузиться operator<<
для типа:
decltype(std::endl<char, std::char_traits<char>>)