Comments 10
Мне нужен!
И уверен другим может пригодиться.
Poco идет под свободной лицензией Boost Software License
https://ru.wikipedia.org/wiki/Boost_Software_License
На счет ваше реализации, супер!
Предлагаю Вам оформить в виде отдельно статьи.
Кроме того заметил, что у вас в списке ОС нет Windows.
Мой же вариант полностью кросс платформенный.
И уверен другим может пригодиться.
Poco идет под свободной лицензией Boost Software License
https://ru.wikipedia.org/wiki/Boost_Software_License
На счет ваше реализации, супер!
Предлагаю Вам оформить в виде отдельно статьи.
Кроме того заметил, что у вас в списке ОС нет Windows.
Мой же вариант полностью кросс платформенный.
Так как Вы пишете, что являетесь новичком в C++, то позвольте покритиковать фрагмент Вашего кода:
Это лучше написать так:
string message = "M-SEARCH * HTTP/1.1\r\n";
message += "HOST: 239.255.255.250:1900\r\n";
message += "ST:" + st + "\r\n";
message += "MAN: \"ssdp:discover\"\r\n";
message += "MX:1\r\n\r\n";
Это лучше написать так:
string message = "M-SEARCH * HTTP/1.1\r\n"
"HOST: 239.255.255.250:1900\r\n"
"ST:" + st + "\r\n"
"MAN: \"ssdp:discover\"\r\n"
"MX:1\r\n\r\n";
Раз вы C++ еще только изучаете, то еще несколько советов:
Исключения не следует ловить по значению, т.к. может произойти «срезка» объекта. Лучше ловить по константной ссылке:
Вот здесь вам не нужна копия IP-адреса для печати:
Лучше брать ссылку на очередное значение, причем константную ссылку дабы подчеркнуть, что ничего изменяться не будет:
Аналогично, полагаю, имеет смысл сделать и с циклом по responses.
В C++11 и выше функцию MakeSsdpRequest имеет смысл переписать так, чтобы она возвращала вектор, а не получала его по неконстантной ссылке:
Что позволит использовать ее вот так:
Такой подход гораздо удобнее и в плане защиты от исключений, и в плане простоты использования.
В C++ редко доводиться видеть конструкции вида:
Обычно довольствуются using namespace, особенно в таких коротких программах примерах:
Исключения не следует ловить по значению, т.к. может произойти «срезка» объекта. Лучше ловить по константной ссылке:
catch (const Poco::TimeoutException &) { }
Вот здесь вам не нужна копия IP-адреса для печати:
for (string ip : ips) {
cout << "IP: " << ip << endl;
}
Лучше брать ссылку на очередное значение, причем константную ссылку дабы подчеркнуть, что ничего изменяться не будет:
for (const string & ip : ips) {
cout << "IP: " << ip << endl;
}
Аналогично, полагаю, имеет смысл сделать и с циклом по responses.
В C++11 и выше функцию MakeSsdpRequest имеет смысл переписать так, чтобы она возвращала вектор, а не получала его по неконстантной ссылке:
vector<string> MakeSsdpRequest(string st = "") {
vector<string> responses;
...
return responses;
Что позволит использовать ее вот так:
int main()
{
auto responses = MakeSsdpRequest();
Такой подход гораздо удобнее и в плане защиты от исключений, и в плане простоты использования.
В C++ редко доводиться видеть конструкции вида:
using std::string;
using std::vector;
using std::cin;
using std::cout;
using std::endl;
using Poco::Net::SocketAddress;
using Poco::Net::DatagramSocket;
using Poco::Timespan;
using Poco::RegularExpression;
Обычно довольствуются using namespace, особенно в таких коротких программах примерах:
using namespace std;
using namespace Poco;
using namespace Poco::Net;
Спасибо за конструктивный комментарий.
const и & — подправил.
using namespace xxx не использую, что бы меня тут не заплевали, мол засоряю…
А вот на счет возврата vector как результат функции, ведь в этом случае произойдет копирование вектора.
На счет того, что такой подход удобнее в использовании, конечно согласен.
Подскажите пожалуйста чем он удобнее в защите от исключений?
const и & — подправил.
using namespace xxx не использую, что бы меня тут не заплевали, мол засоряю…
А вот на счет возврата vector как результат функции, ведь в этом случае произойдет копирование вектора.
На счет того, что такой подход удобнее в использовании, конечно согласен.
Подскажите пожалуйста чем он удобнее в защите от исключений?
А вот на счет возврата vector как результат функции, ведь в этом случае произойдет копирование вектора.
Здесь сработает NRVO-оптимизация, когда возвращаемое значение будет создано на стеке в вызывающей функции, а вызываемая функция будет сразу работать с этим значением.
Подскажите пожалуйста чем он удобнее в защите от исключений?
У вас может быть так:
std::vector<string> responses;
try {
MakeSspdRequest(responses);
} catch(...) { ... }
for(const auto & r : responses) // В каком состоянии сейчас responses?
Если у вас вот такой код:
try {
auto responses = MakeSspdRequest();
...
} catch(...) {...}
То в случае исключения у вас responses просто не останется и не возникнет вопросов о том, что там внутри находится.Sign up to leave a comment.
Поиск устройств в сети по SSDP с помощью Poco